經典力學的基石是牛頓三大定律。而面向對象的可復用設計的第一塊基石,便是所謂的”開-閉“原則(Open-Closed Principle,常縮寫為OCP)。
### 一、什么是開閉原則
“開-閉”原則講的是:一個軟件實體應當對擴展開放,對修改關閉。這一原則最早由Bertrand Meyer提出,英文原文是:
Software entities should be open for extension,but closed for modification.
這個原則說的是,在設計一個模塊的時候應該使這個模塊可以在不被修改的前提下被擴展。換言之,應該可以在不必修改源代碼的情況下改變這個模塊的行為。
### 二、使用開閉原則有什么好處
所有的軟件系統都有一個共同的性質,即對他們的需求會隨著時間的推移而發生變化。在軟件系統面臨新的需求的時候,系統的設計必須是穩定的。滿足“開-閉”原則的設計可以給一個軟件系統兩個無可比擬的優越性:
1、通過擴展已有的軟件系統,可以提供新的行為,以滿足對軟件的新的需求,使變化中的軟件系統有一定的適應性和靈活性。
2、已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統有一定的穩定性和延續性。
具有以上兩個優點的軟件系統是一個在高層次上實現了復用的系統,也是一個易于維護的系統。
### 三、如何做到符合開閉原則
我們來看一下在《西游記》中玉皇大帝在美猴王的挑戰下是怎樣維護天庭的秩序的。
當年大鬧天宮時的美猴王便是玉帝天庭的新挑戰。美猴王說:“皇帝輪流做,明年到我家。只教他搬出去,將天宮讓與我!”對于這項挑戰,太白金星給玉皇大帝提出的建議是:“臣啟陛下……降一道招安圣旨,把他宣來上界……與他籍名在篆……一則不動眾勞師,二則收仙有道也。”
換言之,不勞師動眾、不破壞天規便是“閉”,收仙有道便是“開”。招安之法便是玉帝天庭的“開-閉”原則,通過給美猴王封一個“弼馬溫”的官職,便可使現有系統滿足了變化的需求,而不必更改天庭的既有秩序,如下圖所示。

招安之法的關鍵便是不允許更改現有的天庭秩序,但允許將妖猴納入現有的之中,從而擴展了這一秩序。用面相對象的語言來講,不允許更改的是系統的抽象層,而允許擴展的是系統的實現層。
**抽象化是關鍵**
解決問題的關鍵在于抽象化。在像java這樣的面向對象編程語言里面,可以給系統一個一勞永逸、不再改變的抽象設計,該設計允許有無窮無盡的行為在實現層被實現。在java語言里,可以給出一個或多個抽象java類或者java接口,規定出所有的具體類必須提供的方法的特征作為系統設計的抽象層。這個抽象層預見了所有的可能擴展,因此,在任何情況下都不會改變。這使得系統的抽象層不需要修改,從而滿足了“開-閉”原則的第二條:對修改關閉。
同時,由于從抽象層導出的一個或多個新的具體類可以改變系統的行為,因此系統的設計對擴展是開放的,這就滿足了“開-閉”原則的第一條:對擴展開放。
**對可變性的封裝**
考慮你的設計中有什么可能會發生變化。這一思想用一句話總結為:“找到一個系統的可變因素,將它封裝起來”。
這意味著兩點:
1、一種可變性不應該散落在代碼的很多角落里,而應該被封裝到一個對象里面。同一種可變性的不同表象意味著同一個繼承等級結構中的具體子類。
2、一種可變性不應該與另一種可變性混合在一起。
### 四、結語
盡管很多情況下,無法百分之百的做到“開-閉”原則,但是如果向這個方向上的努力能夠得到部分的成功,也可以顯著地改善一個系統的結構。
- 前言
- 設計原則(一)"開-閉"原則(OCP)
- 設計原則(二)里氏替換原則(LSP)
- 設計原則(三)組合復用原則
- 設計原則(四)依賴倒置原則(DIP)
- 設計模式(一)簡單工廠模式
- 設計模式(二)工廠方法模式
- 設計模式(三)抽象工廠模式
- 設計模式(四)單例模式
- 設計模式(五)創建者模式(Builder)
- 設計模式(六)原型模式
- 設計模式(七)門面模式(Facade Pattern 外觀模式)
- 設計模式(八)橋梁模式(Bridge)
- 設計模式(九)裝飾模式(Decorator)
- 設計模式(十)適配器模式
- 設計模式(十一)策略模式
- 設計模式(十二)責任鏈模式
- 設計模式之UML(一)類圖以及類間關系(泛化 、實現、依賴、關聯、聚合、組合)
- 設計模式之橋梁模式和策略模式的區別