设计原则(一)"开-闭"原则(OCP)
最后更新于:2022-04-01 11:04:55
经典力学的基石是牛顿三大定律。而面向对象的可复用设计的第一块基石,便是所谓的”开-闭“原则(Open-Closed Principle,常缩写为OCP)。
### 一、什么是开闭原则
“开-闭”原则讲的是:一个软件实体应当对扩展开放,对修改关闭。这一原则最早由Bertrand Meyer提出,英文原文是:
Software entities should be open for extension,but closed for modification.
这个原则说的是,在设计一个模块的时候应该使这个模块可以在不被修改的前提下被扩展。换言之,应该可以在不必修改源代码的情况下改变这个模块的行为。
### 二、使用开闭原则有什么好处
所有的软件系统都有一个共同的性质,即对他们的需求会随着时间的推移而发生变化。在软件系统面临新的需求的时候,系统的设计必须是稳定的。满足“开-闭”原则的设计可以给一个软件系统两个无可比拟的优越性:
1、通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件系统有一定的适应性和灵活性。
2、已有的软件模块,特别是最重要的抽象层模块不能再修改,这就使变化中的软件系统有一定的稳定性和延续性。
具有以上两个优点的软件系统是一个在高层次上实现了复用的系统,也是一个易于维护的系统。
### 三、如何做到符合开闭原则
我们来看一下在《西游记》中玉皇大帝在美猴王的挑战下是怎样维护天庭的秩序的。
当年大闹天宫时的美猴王便是玉帝天庭的新挑战。美猴王说:“皇帝轮流做,明年到我家。只教他搬出去,将天宫让与我!”对于这项挑战,太白金星给玉皇大帝提出的建议是:“臣启陛下……降一道招安圣旨,把他宣来上界……与他籍名在篆……一则不动众劳师,二则收仙有道也。”
换言之,不劳师动众、不破坏天规便是“闭”,收仙有道便是“开”。招安之法便是玉帝天庭的“开-闭”原则,通过给美猴王封一个“弼马温”的官职,便可使现有系统满足了变化的需求,而不必更改天庭的既有秩序,如下图所示。
![这里写图片描述](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-04-20_571757d972a72.jpg "")
招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有的之中,从而扩展了这一秩序。用面相对象的语言来讲,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。
**抽象化是关键**
解决问题的关键在于抽象化。在像java这样的面向对象编程语言里面,可以给系统一个一劳永逸、不再改变的抽象设计,该设计允许有无穷无尽的行为在实现层被实现。在java语言里,可以给出一个或多个抽象java类或者java接口,规定出所有的具体类必须提供的方法的特征作为系统设计的抽象层。这个抽象层预见了所有的可能扩展,因此,在任何情况下都不会改变。这使得系统的抽象层不需要修改,从而满足了“开-闭”原则的第二条:对修改关闭。
同时,由于从抽象层导出的一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的,这就满足了“开-闭”原则的第一条:对扩展开放。
**对可变性的封装**
考虑你的设计中有什么可能会发生变化。这一思想用一句话总结为:“找到一个系统的可变因素,将它封装起来”。
这意味着两点:
1、一种可变性不应该散落在代码的很多角落里,而应该被封装到一个对象里面。同一种可变性的不同表象意味着同一个继承等级结构中的具体子类。
2、一种可变性不应该与另一种可变性混合在一起。
### 四、结语
尽管很多情况下,无法百分之百的做到“开-闭”原则,但是如果向这个方向上的努力能够得到部分的成功,也可以显著地改善一个系统的结构。