設計模式的原則就是OOD的原則,或者說設計模式是為了達到OOD的遠景而提出的,所以真正想掌握OO的精髓,學習設計模式是最好的途徑,而想真正掌握設計模式的精髓,就必須好好理解一下OOD的設計原則.
OOD原則的一個基石就是“開-閉原則”(Open-Closed Principle OCP)。這個原則最早是由Bertrand Meyer在他的第一版《Object-Oriented Software Construction》提出,英文的原文是:Software entities should be open for extension,but closed for modification。A class should be open for extension, but closed for modification.
Object-Oriented Software Construction 書的封面
開放-封閉原則:軟件實體(類,模塊,函數等等)應該是可以擴展的,但是不可修改的。也就是說,我們在設計一個模塊的時候,可以在不修改這個模塊的前提下來擴展它,也就是,可以在不修改源代碼的情況下擴展這個模塊的行為。
滿足OCP的設計給系統帶來兩個無可比擬的優越性.
- 通過擴展已有的軟件系統,可以提供新的行為,以滿足對軟件的新需求,使變化中的軟件系統有一定的適應性和靈活性.
- 已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統有一定的穩定性和延續性.
具有這兩個優點的軟件系統是一個高層次上實現了復用的系統,也是一個易于維護的系統。那么,我們如何才能做到這個原則呢?不能修改而可以擴展,這個看起來
是自相矛盾的,其實這個是可以做到的,按面向對象的說法,這個就是不允許更改系統的抽象層,而允許擴展的是系統的實現層.
解決問題的關鍵在抽象化。我們讓模塊依賴于一個固定的抽象體,這樣它就是不可以修改的;同時,通過這個抽象體派生,我們就可以擴展此模塊的行為功能。如此,這樣設計的程序只通過增加代碼來變化而不是通過更改現有代碼來變化,前面提到的修改的副作用就沒有了。
"開-閉"原則如果從另外一個角度講述,就是所謂的"對可變性封裝原則"(Principle of Encapsulation of
Variation,
EVP)。講的是找到一個系統的可變因素,將之封裝起來。在我們考慮一個系統的時候,我們不要把關注的焦點放在什么會導致設計發生變化上,而是考慮允許什
么發生變化而不讓這一變化導致重新設計。也就是說,我們要積極的面對變化,積極的包容變化,而不是逃避。
[SHALL01]將這一思想用一句話總結為:"找到一個系統的可變因素,將它封裝起來",并將它命名為"對可變性的封裝原則"。
"對可變性的封裝原則"意味者兩點:
1. 一種可變性應當被封裝到一個對象里面,而不應當散落到代碼的很多角落里面。同一種可變性的不同表象意味著同一個繼承等級結構中的具體子類。繼承應當被看做是封裝變化的方法,而不應當是被認為從一般的對象生成特殊的對象的方法(繼承經常被濫用)。
2. 一種可變性不應當與另外一種可變性混合在一起,從具體的類圖來看,如果繼承結構超過了兩層,那么就意味著將兩種不同的可變性混合在了一起。
"對可變性的封裝原則"從工程的角度說明了如何實現OCP.如果按照這個原則來設計,那么系統就應當是遵守OCP的.
但是現實往往是殘酷的,我們不可能100%的遵守OCP,但是我們要向這個目標來靠近.設計者要對設計的模塊對何種變化封閉做出選擇.
1、英文講解:The Open-Closed Principle