設計模式的分類和六大原則


設計模式的分類

總的來說,設計模式分位三大類:

  1. 創建型模式(5種)
    工廠方法模式、抽象工廠模式、單例模式、建造者模式、原型模式
  2. 結構型模式(7種)
    適配器模式、裝飾器模式、代理模式、外觀模式(門面模式)、橋接模式、組合模式、享元模式
  3. 行為型模式(11種)
    策略模式、模板方法模式、觀察者模式、迭代器模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式

六大原則

總原則:開閉原則

定義:一個軟件實體應該對擴展開放,對修改關閉。

當一個軟件實體需要擴展的時候,不要去修改原有的代碼,而是去擴展原有的代碼。
開閉原則是最基礎的一個原則,六大原則都是開閉原則的具體形態。
采用開閉原則的原因:

  1. 避免測試復雜化:
    通過擴展實現變化,測試只需要對新增類進行單元測試即可,只需要保證新類提供的方法正確就行。

  2. 提高代碼復用性:
    避免以后為了修改一個微小的缺陷或增加新功能,卻要在整個項目中到處查找相關的代碼逐一修改。

  3. 提高可維護性:
    開發新功能時,擴展一個類往往比修改一個類更容易。

1. 單一職責原則

定義:有且僅有一個原因引起類的變更

優點:

  1. 類的復雜性降低
  2. 可讀性提高
  3. 易維護
  4. 修改類引起的風險降低

臨界點:

  1. 過度的划分會使類劇增,增加系統的復雜度

2. 里氏代換原則

定義:所有引用基類的地方必須能透明地使用其子類的對象

優點:

  1. 提高代碼的重用性
  2. 提高代碼的可拓展性
  3. 提高項目的開放性

缺點:

  1. 記成是入侵式的,只要繼承,就有父類的屬性和方法
  2. 降低代碼靈活性,子類多了父類的約束
  3. 增強耦合性,父類的常量/變量/方法改動時,必須考慮子類的修改

四層含義:

  1. 子類可以實現父類的抽象方法,但不能覆蓋父類的非抽象方法。
  2. 子類中可以增加自己特有的方法。
  3. 當子類的方法重載父類的方法時,方法的前置條件(即方法的形參)要比父類方法的輸入參數更寬松。
  4. 當子類的方法實現父類的抽象方法時,方法的后置條件(即方法的返回值)要比父類更嚴格。

3. 依賴倒轉原則

定義:

  1. 高層模塊不應該依賴低層模塊,兩者都要依賴其抽象(模塊間的依賴通過抽象產生,實現類不直接發生依賴)
  2. 抽象不應該依賴細節(接口或者抽象類不依賴實現類)
  3. 細節可以依賴抽象(實現類依賴接口或抽象類)

處理:

  1. 每個類盡量都有接口或者抽象類
  2. 變量的表面類型盡量是接口或者抽象類
  3. 任何類都不應該從具體類派生
  4. 盡量不要復寫基類已實現的方法
  5. 結合里氏替換原則使用

4. 依賴倒轉原則

定義:客戶端不應該依賴不需要的接口,類之間的依賴關系應該建立在最小的接口上

四層含義:

  1. 接口盡量小,不要出現臃腫的接口
  2. 接口要高內聚
  3. 只提供訪問者需要的方法,每個接口中不存在子類用不到卻必須要實現的內容,可以將接口拆分
  4. 接口設計限度:設計粒度越小系統越靈活,結構會越復雜,可維護性降低

處理:

  1. 一個接口只服務一個子模塊或者業務邏輯
  2. 盡量壓縮接口內的方法,保證都是有用的,避免臃腫
  3. 已被污染的接口盡量去修改,若變更風險大,采用適配器模式轉化處理
  4. 深入了解業務邏輯

5. 迪米特法則(最少知道原則)

定義:一個對象應該對其他對象有最小的了解(低耦合)

含義:

  1. 方法盡量不引入類中不存在的對象
  2. 盡量不要暴露過多public方法和非晶態public變量,盡量內斂
  3. 如果一個方法放在本類中,既不增加類間的關系,也不對本類產生負面影響,就可放置在本類中

總結:

核心觀念就是類間解耦,低耦合。其負面影響就是產生了大量的中轉或者跳轉類,導致系統復雜性提高,也為維護帶來了難度。需要反復權衡,既做到結構清晰,又要高內聚低耦合。
如果一個類需要跳轉兩次以上才能訪問到另一個類,就需要想辦法重構了。

6. 合成復用原則

定義:是在一個新的對象里面使用一些已有的對象,使其成為新對象的一部分。新對象通過委派達到復用已有功能的效果。

優點:

使用對象的合成/聚合將有助於保持每個類被封裝,並被集中在單個任務上。這樣類和集成層次會保持較小規模,並且不太可能增長為不可控制的龐然大物

缺點:

通過這種方式復用建造的系統會有較多的對象需要管理;為了能將多個不同的對象作為組合塊來使用,必須仔細地對接口進行定義

簡單地說:盡量首先使用合成/聚合的方式,而不是使用繼承


免責聲明!

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



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