6. 开闭原则(Open Closed Principle,OCP)
6.1 定义
(1)一个类应该对扩展开放,对修改关闭。要求通过扩展来实现变化,而且是在不修改己有的代码情况下进行扩展,也不必改动己有的源代码或二进制代码。
(2)在软件生命周期内,变化是一个既定的事实,在设计时尽量适应这些变化,以提高项止的稳定性和灵活性,真正实现“拥抱变化”。而开闭原则告诉我们要通过扩展来实现这些变化而不是修改原来代码。
(3)修改关闭,并不意味着软件不做任何的改动,低层模块的变更,必然要高层模块进行耦合,否则就是一个弧立无意义的代码片段。
6.2 开闭原则优点
(1)通过扩展己有的功能,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性
(2)己有的软件模块,特别是最重要的抽象层模块不能再修改,这就使得变化中的软件有一定的稳定性和延续性
(3)同时满足了可复用性与可维护性
6.3 如何使用开闭原则
(1)抽象约束
①通过接口或抽象类约束扩展,对扩展进行边界限定。通过接口,只能使用由接口提供的方法。
②参数类型、引用对象尽量使用接口或抽象类,而不是具体的实现类
③抽象层尽量保持稳定,一旦确定就不要修改。
(2)元数据(metadata)控制模块行为
元数据就是用来描述环境和数据的数据。尽量使用元数据来控制程序的行为,减少重复开发。
(3)制定项目章程
(4)封装变化
①将相同的变化封装到一个接口或抽象类中;变化不应当散落在代码的许多角落,而应当被封装到一个对象里。同一种变化的不同表象意味着是同一个继承等级结构中的具体子类。
②将不同的变化封装到不同的接口或抽象类中,不应该有两个不同变化出现在同一个接口或抽象类。一种变化与另一种变化混合在一起,会违反单一性原则,所以应被分开。
6.4 最佳实践
(1)几种设计原则的小结(6个原则的首字母组合单词(S.O.L.I.D,表示稳定)
①单一职责原则告诉我们实现类要职责单一;
②里氏替换原则告诉我们不要破坏继承体系;
③依赖倒置原则告诉我们要面向接口编程;
④接口隔离原则告诉我们在设计接口的时候要精简单一;
⑤迪米特法则告诉我们要降低耦合。
⑥开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。
(2)建立稳定、灵活、健壮的设计,开闭原则是最基础的原则,也是精神领袖
(3)开闭原则是最基础的一个原则,前五个原则都是开闭原则的具体形态,而开闭原则才是灵魂。换一个角度,借用OOP的说法,开闭原则是抽象类,其他五大原则是具体的实现类。