面向对象的可复用性设计的第一基石是所谓的开-闭原则OCP(OCP,Open-Close Principle),OCP意为对扩展开放,对修改关闭。在设计一个模块时,应当使这个模块在不被修改的前提下被扩展。换言之,应该在不必修改源代码的情况下改变这个模块的行为。
OCP的关键是抽象化,可以给出一个或者多个抽象的Java类或者Java接口,这个抽象层遇见了所有的可能扩展性,因此,在任何扩展情况下都不会改变,这就使得系统的抽象层不需要修改,从而满足OCP的“对修改关闭”的原则。同时,由于抽象层导出的一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的,这就满足了OCP的“对扩展开放”。开闭原则换句话说,就是“对可变行性的封装原则”,找到一个系统的可变因素,将之封装起来,允许这个因素发生变化而不会导致系统需要重新设计。
上面提到几次Java接口和抽象类,他们的区别在哪里?
(1)最明显的区别,Java抽象类可以提供某些方法的部分实现,而Java接口不可以。这大概是Java抽象类唯一的有点。 如果像Java抽象类加入一个具体的方法,所有子类都得到了这个方法,而Java接口做不到这点,Java接口加入新的方法后,所有实现这个接口的类都不能成功通过编译。这是Java接口的缺点。
(2)一个抽象类的实现只能由这个抽象类的子类给出,而Java语言限制只能单继承,而接口可以多实现,这是两者最重要的区别。
(3)从代码重构的角度,添加一个Java抽象类作为抽象类型不容易,因为这个类可能已经有超类,这个抽象类只能继续往上移动,到达等级结构的上端,等级结构中的所有成员都会受影响。
(4)Java接口是定义混合类型的理想工具。——《Java与模式》
结合对实际代码的重构,对此能有更深的体会。