2.設計模式-七大原則(C++)


任何一個設計模式都離不開七大原則中的任一原則.所以七大原則非常重要,只要我們明白了七大原則,就可以知道如何在項目中使用什么設計原則了.

設計模式的七大原則如下所示:

  • 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.合成復用原則

  • 優先使用對象組合,而不是類繼承
  • 繼承復用:又稱"白箱復用",容易破壞封裝性,耦合度高,不利於類的擴展和維護
  • 組合或聚合復用:又稱"黑箱復用",耦合度低,靈活度高
  • 對象組合只要求被組合的對象具有良好定義的接口,耦合度低。

繼承的原則是用來子類替換基類,如果一味地使用類繼承,那么之類的子類會繼承出很多不需要的屬性,在后面的設計模式中會舉例出來.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM