定義:一個軟件實體。如類/模塊/函都應該對擴展開放,對修改關閉。
問題由來:在軟件的生命周期內,因為變化,升級和維護等原因需要對軟件原有代碼進行修改,可能會給舊代碼引入錯誤,也有可能會使我們不得不對整個功能進行重構,並且需要原有代碼經過重新測試。
解決方案:當軟件需要變化時,盡量通過擴展軟件實體的行為來實現變化,而不是通過修改已有的代碼來實現。
開閉原則是面向對象設計中最基礎的設計原則,它指導我們如何建立穩定靈活的系統,開閉原則只定義了對修改關閉,對擴展開放。其實只要遵循前面5中設計模式,設計出來的軟件就是符合開閉原則的。
用抽象構建架構,用實現擴展細節。因為抽象靈活性好,適應性廣,只要抽象的合理,可以基本保證架構的穩定。而軟件中易變的細節,我們用從抽象派生的實現類來進行擴展,當軟件需要發生變化時,我們只需要根據需求重新派生一個實現類來擴展就可以了,當然前提是抽象要合理,要對需求的變更有前瞻性和預見性。
- 單一職責原則告訴我們實現類要職責單一;
- 里氏替換原則告訴我們不要破壞繼承關系;
- 依賴倒置原則告訴我們要面向接口編程;
- 接口隔離原則告訴我們在設計接口的時候要精簡單一;
- 迪米特法則告訴我們要降低耦合
- 開閉原則告訴我們要對擴展開發,對修改關閉;
那么如何去遵守這六個原則,對這六個原則的遵守並不是是和否的問題,而是多和少的問題,也就是說,我們一般不會說有沒有遵守,而是說遵守程度達到多少,任何事過猶不及,設計模式六個設計原則也是一樣,制定這六個原則並不是一味的要求我們去遵守他們,而是根據實際情況靈活運用,
圖中的每一條維度代表一項原則,我們依據對這個遵守程度在維度上畫一個點,則如果對這項原則遵守的合理的話,這個點會落在紅色的圈中,如果遵守的差會落在小圓圈里,遵守的差會落在大圓圈外面,一個良好的設計體現在圖中,應該是六個點都在同心圓中的六邊形。
如上圖,設計1和設計2屬於良好設計,他們對六項原則遵守程度都在合理范圍內,設計3和設計4雖然有些不足,但也基本可以接受,設計5和設計6,一個幾乎不遵守,一個遵守過度,那么這兩種設計模式都是迫切需要重構的。
轉載:http://blog.csdn.net/zhengzhb/article/details/7296944