7.2 Open-Closed Principle(开放—封闭原则,OCP)

    Software Entities(Classes, Modules, Functions, etc.)Should Be Open For Extension, But Closed For Modification.

    软件实体(类、模块、功能等)应当对扩展开放,但是对修改关闭。

    就是说,使用OOP进行开发,我们只能修改已有的类的错误(Bugs),若是扩展它们的功能,我们不能修改它们,而是要通过添加新类(实体)来解决,这即开放—封闭原则。为了不破坏OCP原则,我们下面尝试了两种方案。

    方案一

    对于上述问题,为了避免增加修改已有GenericRepositoryHibernate类的代码,有人提议创建一个新类实现GenericRepository接口,代码片段大致如下。

    figure_0113_0103

    问题:代码重复。

    不难看出,上述代码斜体加粗的部分与GenericRepositoryHibernate类的update(Object o)方法的代码重复,虽然未违反OCP原则,却违反了DRY原则。

    方案二

    我们想到,为了重用代码,可以使用继承,可以让LogRepositoryHibernate继承于GenericRepositoryHibernate类,不错,我们看看如何实现,代码大致如下所示。

    figure_0114_0104

    问题:扩展性不高,代码重复仍然未能避免。

    上述解决方法一定程度地避免了代码重复,如果我们使用JPA来实现持久化,该怎么办呢?我们就必须得增加新持久化实现,设计可能如图7-1所示。

    figure_0114_0105

    图7-1

    这样明显会造成类的膨胀,我们每使用一种新持久化方法,就需要一个新的LogRepository实现类,有没有更好的方式呢?答案是有的,请看下节。