一、什么是开-闭原则?
一个软件实体应当对扩展开放,对修改关闭。
也就是说,在设计一个模块时,应当使这个模块可在不被修改的前提下被扩展。换言之,就是在不必修改原有代码的情况下给模块添加新行为。
开-闭原则是面向对象设计最核心的原则。
二、怎样做到开-闭原则?
关键是抽象化。可给系统定义出一个不再更改的抽象设计,然后在此抽象设计的基础上可提供任意数量的实现。
抽象层不需要修改,从而满足了“对修改关闭”;可添加新的具体实现来添加新行为,因此满足了“对扩展开放”。
开闭原则从另一个角度讲述,就是“ 对可变性的封装原则 ”。考虑到系统将来在某些地方可能会发生改变,在设计时考虑将其封装。该原则意味着两点:
(1)一种可变性不应当散落在代码的很多角落,而应当被封闭到一个对象里。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。
(2)一种可变性不应当与另一种可变性混合在一起。
通常很难百分百保证开-闭原则,所以要重点考虑会有什么变化,仅针对可变的地方应用开-闭原则。
三、与其他原则的关系
(1)里氏代换原则
是对开-闭原则的补充。开闭原则的关键是抽象。而基类和子类的继承关系就是抽象化的具体实现,所以里氏代换原则是抽象化的具体步骤的规范。
(2)合成/聚合复用原则
合成/聚合复用原则也是对开-闭原则的补充。合成/聚合复用原则要求优先使用合成/聚合,而不是继承。
(3)依赖倒转原则
依赖倒转原则是手段,开-闭原则是目标,可通过依赖倒置原则这一手段实现开闭原则这一目标。
(4)迪米特法则
迪米特法则使得各个模块相对更加独立,进行扩展时,更容易地做到对修改关闭。是实现开-闭原则的一条道路。
(5)接口隔离原则
接口隔离原则限制通信,使得系统更容易地做到对修改关闭。