任何一個設計模式都離不開七大原則中的任一原則.所以七大原則非常重要,只要我們明白了七大原則,就可以知道如何在項目中使用什么設計原則了.
設計模式的七大原則如下所示:
- 1.單一職責原則
- 2.開放-封閉原則
- 3.依賴倒置原則
- 4.里氏替換原則(LSP)
- 5.接口隔離原則
- 6.迪米特原則(最少知道原則)
- 7.合成復用原則
1.單一職責原則
- 一個類應該僅有一個引起它變化的原因。
- 變化的方向隱含着類的責任。
每個類都做獨立的事情,如果類的功能太多,可能引起它變化的原因就越多,這將導致功能依賴,相互之間就產生影響,從而極大的損傷其內聚性和耦合度。
比如視頻的解封裝和解碼,如果放在一個類,那么以后想改變策略,本地不解碼,只是轉發解封裝后的數據到另個地方,那么將會導致冗余,以前寫的代碼到底該不該刪除?所以最好分開實現!
2.依賴倒置原則
- 高層模塊(穩定)不應該依賴於低層模塊(變化),二者都應該依賴於抽象(穩定) 。
- 抽象(穩定)不應該依賴於實現細節(變化) ,實現細節應該依賴於抽象(穩定)。
比如我們之前用多態實現的畫板程序:
- 對應的高層模塊就是 : PainterWindow(穩定的類、應該只操作Shape抽象類)
- 底層模塊是 : Line、Rectangle(具體的類、容易變化的)
- 抽象模塊是 : Shape(抽象類、提供穩定的接口)
其實我們這里的mouseUp()里實現的不是很好,因為有操作具體的底層模塊.
我們應該提供一個工廠類給mouseUp()使用,通過工廠類來創建用戶要畫的什么圖形.從而讓我們的高層模塊(PainterWindow)實現穩定效果,以后增改需求,就不需要改這個類了。
3.開放-封閉原則
- 對擴展開放,對更改封閉。
- 類模塊應該是可擴展的,但是不可修改。
比如我們之前用多態實現的畫板程序,當我們添加一個橢圓類時,只需要新增橢圓類文件,然后在工廠類中添加一個生成橢圓類的代碼即可(擴展是開放的,並且無需更改原有的代碼).
4.里氏替換原則(LSP)
- 子類必須能夠替換它們的基類(IS-A)。
- 繼承表達類型抽象。
父類出現的方法,子類應該也要出現,通過調用父類的方法來實現虛函數調用子類.從而實現替換(不同子類實現的效果不同,但是調用父類的代碼是相同的).
5.接口隔離原則
- 不應該強迫客戶程序依賴它們不用的方法。
- 接口應該小而完備。
使用多個專門的接口,而不使用單一的總接口,即類不應該依賴那些它不需要的接口。比如后期該接口發生了變化,那么這個類也要去進行修改,增大修改的成本
6.迪米特原則(最少知道原則)
- 不將變量類型聲明為某個特定的具體類(比如Shape的Line子類),而是聲明為某個接口(Shape類)。
- 客戶程序(PainterWindow類)無需獲知對象的具體類型(Line、Rectangle),只需要知道對象所具有的接口(Shape)。
- 減少系統中各部分的依賴關系,從而實現“高內聚、松耦合”的類型設計方案
7.合成復用原則
- 優先使用對象組合,而不是類繼承
- 繼承復用:又稱"白箱復用",容易破壞封裝性,耦合度高,不利於類的擴展和維護
- 組合或聚合復用:又稱"黑箱復用",耦合度低,靈活度高
- 對象組合只要求被組合的對象具有良好定義的接口,耦合度低。
繼承的原則是用來子類替換基類,如果一味地使用類繼承,那么之類的子類會繼承出很多不需要的屬性,在后面的設計模式中會舉例出來.