開放-封閉原則(OCP:The Open-Closed Principle)
設(shè)計(jì)模式的原則就是OOD的原則,或者說設(shè)計(jì)模式是為了達(dá)到OOD的遠(yuǎn)景而提出的,所以真正想掌握OO的精髓,學(xué)習(xí)設(shè)計(jì)模式是最好的途徑,而想真正掌握設(shè)計(jì)模式的精髓,就必須好好理解一下OOD的設(shè)計(jì)原則.OOD原則的一個(gè)基石就是“開-閉原則”(Open-Closed Principle OCP)。這個(gè)原則最早是由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 書的封面

開放-封閉原則:軟件實(shí)體(類,模塊,函數(shù)等等)應(yīng)該是可以擴(kuò)展的,但是不可修改的。也就是說,我們?cè)谠O(shè)計(jì)一個(gè)模塊的時(shí)候,可以在不修改這個(gè)模塊的前提下來擴(kuò)展它,也就是,可以在不修改源代碼的情況下擴(kuò)展這個(gè)模塊的行為。
滿足OCP的設(shè)計(jì)給系統(tǒng)帶來兩個(gè)無可比擬的優(yōu)越性.
- 通過擴(kuò)展已有的軟件系統(tǒng),可以提供新的行為,以滿足對(duì)軟件的新需求,使變化中的軟件系統(tǒng)有一定的適應(yīng)性和靈活性.
- 已有的軟件模塊,特別是最重要的抽象層模塊不能再修改,這就使變化中的軟件系統(tǒng)有一定的穩(wěn)定性和延續(xù)性.
具有這兩個(gè)優(yōu)點(diǎn)的軟件系統(tǒng)是一個(gè)高層次上實(shí)現(xiàn)了復(fù)用的系統(tǒng),也是一個(gè)易于維護(hù)的系統(tǒng)。那么,我們?nèi)绾尾拍茏龅竭@個(gè)原則呢?不能修改而可以擴(kuò)展,這個(gè)看起來 是自相矛盾的,其實(shí)這個(gè)是可以做到的,按面向?qū)ο蟮恼f法,這個(gè)就是不允許更改系統(tǒng)的抽象層,而允許擴(kuò)展的是系統(tǒng)的實(shí)現(xiàn)層.
解決問題的關(guān)鍵在抽象化。我們讓模塊依賴于一個(gè)固定的抽象體,這樣它就是不可以修改的;同時(shí),通過這個(gè)抽象體派生,我們就可以擴(kuò)展此模塊的行為功能。如此,這樣設(shè)計(jì)的程序只通過增加代碼來變化而不是通過更改現(xiàn)有代碼來變化,前面提到的修改的副作用就沒有了。
"開-閉"原則如果從另外一個(gè)角度講述,就是所謂的"對(duì)可變性封裝原則"(Principle of Encapsulation of Variation, EVP)。講的是找到一個(gè)系統(tǒng)的可變因素,將之封裝起來。在我們考慮一個(gè)系統(tǒng)的時(shí)候,我們不要把關(guān)注的焦點(diǎn)放在什么會(huì)導(dǎo)致設(shè)計(jì)發(fā)生變化上,而是考慮允許什 么發(fā)生變化而不讓這一變化導(dǎo)致重新設(shè)計(jì)。也就是說,我們要積極的面對(duì)變化,積極的包容變化,而不是逃避。
[SHALL01]將這一思想用一句話總結(jié)為:"找到一個(gè)系統(tǒng)的可變因素,將它封裝起來",并將它命名為"對(duì)可變性的封裝原則"。 "對(duì)可變性的封裝原則"意味者兩點(diǎn):
2. 一種可變性不應(yīng)當(dāng)與另外一種可變性混合在一起,從具體的類圖來看,如果繼承結(jié)構(gòu)超過了兩層,那么就意味著將兩種不同的可變性混合在了一起。
"對(duì)可變性的封裝原則"從工程的角度說明了如何實(shí)現(xiàn)OCP.如果按照這個(gè)原則來設(shè)計(jì),那么系統(tǒng)就應(yīng)當(dāng)是遵守OCP的.
但是現(xiàn)實(shí)往往是殘酷的,我們不可能100%的遵守OCP,但是我們要向這個(gè)目標(biāo)來靠近.設(shè)計(jì)者要對(duì)設(shè)計(jì)的模塊對(duì)何種變化封閉做出選擇.
1、英文講解:The Open-Closed Principle
2、Critique of Bertrand Meyer's
Object Oriented Software Construction,
2nd Edition
posted on 2008-04-18 11:06 gembin 閱讀(1060) 評(píng)論(1) 編輯 收藏 所屬分類: 設(shè)計(jì)模式