設(shè)計模式6大設(shè)計原則

1. 單一職責原則

定義

單一職責原則(SRP:Single responsibility principle)又稱單一功能原則。它規(guī)定一個類應(yīng)該只有一個發(fā)生變化的原因。

闡述

單一職責適用于接口、類、方法。顧名思義,就是要求一個接口或類只有一個職責,它就負責一件事情。

好處

  • 類的復雜性降低,有清晰明確的定義
  • 提高了可讀性和可維護性
  • 使得變更引起的風險降低

注意

職責沒有一個量化的標準,并且受非常多因素的制約,現(xiàn)實中實現(xiàn)起來會有困難。

2. 里氏替換原則

定義1

如果對每一個類型為S的對象o1,都有類型為T的對象o2,使得以T定義的所有程序P在所有的對象o1都代替成o2時,程序P的行為沒有發(fā)生變化,那么類型S是類型T的子類型。

定義2

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

闡述

通俗點講,只要父類能出現(xiàn)的地方子類就可以出現(xiàn),而且替換為子類也不會產(chǎn)生任何錯誤或異常,使用者可能根本就不需要知道是父類還是子類。

里氏替換原則的4層含義

  • 子類必須完全實現(xiàn)父類的方法
  • 子類可以有自己的個性
  • 覆蓋或?qū)崿F(xiàn)父類的方法時輸入?yún)?shù)可以被放大
  • 覆寫或?qū)崿F(xiàn)父類的方法時輸出結(jié)果可以被縮小

3. 依賴倒置原則

定義

依賴倒置原則(Dependence Inversion Principle,DIP),包含三層含義:

  • 高層模塊不應(yīng)該依賴低層模塊,兩者都應(yīng)該依賴其抽象
  • 抽象不應(yīng)該依賴細節(jié)
  • 細節(jié)應(yīng)該依賴抽象

在Java語言中的表現(xiàn)

  • 模塊間的依賴通過抽象發(fā)生,實現(xiàn)類之間不發(fā)生直接的依賴關(guān)系,其依賴關(guān)系是通過接口或抽象類產(chǎn)生的;
  • 接口或抽象類不依賴于實現(xiàn)類;
  • 實現(xiàn)類依賴接口或抽象類。

好處

采用依賴倒置原則可以減少類間的耦合性,提高系統(tǒng)的穩(wěn)定性,降低并行開發(fā)引起的風險,提高代碼的可讀性和可維護性。

實踐方法

  • 每個類盡量都有接口或抽象類,或者抽象類和接口兩者都具備
  • 變量的表面類型盡量是接口或者是抽象類(有些不必,如xxxUtil類等)
  • 任何類都不應(yīng)該從具體類派生,盡量不要覆寫基類的方法

結(jié)合里氏替換原則

接口負責定義public屬性和方法,并且聲明與其他對象的依賴關(guān)系,抽象類負責公共構(gòu)造部分的實現(xiàn),實現(xiàn)類準確的實現(xiàn)業(yè)務(wù)邏輯,同時在適當?shù)臅r候?qū)Ω割愡M行細化。

在項目中,大家只要記住是“面向接口編程”就基本上抓住了依賴倒置原則的核心。

4. 接口隔離原則

定義

  • 客戶端不應(yīng)該依賴它不需要的接口
  • 類間的依賴關(guān)系應(yīng)該建立在最小的接口上

闡述

接口隔離原則與單一職責的審視角度是不相同的,單一職責要求的是類和接口職責單一,注重的是職責,這是業(yè)務(wù)邏輯上的劃分,而接口隔離原則要求接口的方法盡量少。

結(jié)構(gòu)隔離原則的4層原則

  • 接口要盡量小
  • 接口要高內(nèi)聚
  • 定制服務(wù)(單獨為一個個體提供優(yōu)良的服務(wù))
  • 接口設(shè)計是有限度的(靈活設(shè)計接口粒度大?。?/li>

5. 迪米特法則

定義

迪米特法則(Law of Demeter,LoD)也稱為最少知識原則(Least Knowledge Principle,LKP):一個對象應(yīng)該對其他對象有最少的了解。

闡述

通俗地講,一個類應(yīng)該對自己需要耦合或調(diào)用的類知道得最少,你(被耦合或調(diào)用的類)的內(nèi)部是如何復雜都和我沒關(guān)系,那是你的事情,我就知道你提供的這么多public方法,我就調(diào)用這么多,其他的我一概不關(guān)心。

迪米特法則的幾層含義

  • 只和朋友交流(出現(xiàn)在成員變量、方法的輸入輸出參數(shù)中的類稱為成員朋友類,而出現(xiàn)在方法體內(nèi)部的類不屬于朋友)
  • 朋友間也是有距離的
  • 是自己的就是自己的(如果一個方法放在本類中,既不增加類間關(guān)系,也對本類不產(chǎn)生負面影響,就放置在本類中)

6. 開閉原則

定義

一個軟件實體如類、模塊和函數(shù)應(yīng)該對擴展開放,對修改關(guān)閉。

闡述

開閉原則告訴我們應(yīng)盡量通過擴展軟件實體的行為來實現(xiàn)變化,而不是通過修改已有的代碼來完成變化,它是為軟件實體的未來事件而制定的對現(xiàn)行開發(fā)設(shè)計進行約束的一個原則。

重要性

開閉原則是最基礎(chǔ)的一個原則。有以下好處:

  • 方便測試
  • 提高復用性
  • 提高可維護性
  • 符合面向?qū)ο箝_發(fā)技術(shù)

實現(xiàn)方法

  • 抽象約束
    • 通過接口或抽象類約束擴展,對擴展進行邊界限定,不允許出現(xiàn)在接口或抽象類中不存在的public方法
    • 參數(shù)類型、引用對象盡量使用接口或者抽象類,而不是實現(xiàn)類
    • 抽象層盡量保持穩(wěn)定,一旦確定即不允許修改
  • 盡量用配置參數(shù)控制程序的行為(如spring和strust的配置文件)

總結(jié)

六個原則如下:

  • Single Responsibility Principle:單一職責原則
  • Open Closed Principle:開閉原則
  • Liskov Substitution Principle:里氏替換原則
  • Law of Demeter:迪米特法則
  • Interface Segregation Principle:接口隔離原則
  • Dependence Inversion Principle:依賴倒置原則

把這6個原則的首字母(里氏替換原則和迪米特法則的首字母重復,只取一個)聯(lián)合起來就是SOLID(solid,穩(wěn)定的),其代表的含義也就是把這6個原則結(jié)合使用的好處:建立穩(wěn)定、靈活、健壯的設(shè)計,而開閉原則又是重中之重,是最基礎(chǔ)的原則,是其他5大原則的精神領(lǐng)袖。

遵循這6大設(shè)計原則基本上可以應(yīng)對大多數(shù)變化,適當時候可以進行擴充,但是也并不局限于這6大設(shè)計原則。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容