設計模式6大設計原則
1. 單一職責原則
定義
單一職責原則(SRP:Single responsibility principle)又稱單一功能原則。它規定一個類應該只有一個發生變化的原因。
闡述
單一職責適用於介面、類、方法。顧名思義,就是要求一個介面或類只有一個職責,它就負責一件事情。
好處
- 類的複雜性降低,有清晰明確的定義
- 提高了可讀性和可維護性
- 使得變更引起的風險降低
注意
職責沒有一個量化的標準,並且受非常多因素的制約,現實中實現起來會有困難。
2. 里氏替換原則
定義1
如果對每一個型別為S的物件o1,都有型別為T的物件o2,使得以T定義的所有程式P在所有的物件o1都代替成o2時,程式P的行為沒有發生變化,那麼型別S是型別T的子型別。
定義2
所有引用基類的地方必須能透明地使用其子類的物件。
闡述
通俗點講,只要父類能出現的地方子類就可以出現,而且替換為子類也不會產生任何錯誤或異常,使用者可能根本就不需要知道是父類還是子類。
里氏替換原則的4層含義
- 子類必須完全實現父類的方法
- 子類可以有自己的個性
- 覆蓋或實現父類的方法時輸入引數可以被放大
- 覆寫或實現父類的方法時輸出結果可以被縮小
3. 依賴倒置原則
定義
依賴倒置原則(Dependence Inversion Principle,DIP),包含三層含義:
- 高層模組不應該依賴低層模組,兩者都應該依賴其抽象
- 抽象不應該依賴細節
- 細節應該依賴抽象
在Java語言中的表現
- 模組間的依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過介面或抽象類產生的;
- 介面或抽象類不依賴於實現類;
- 實現類依賴介面或抽象類。
好處
採用依賴倒置原則可以減少類間的耦合性,提高系統的穩定性,降低並行開發引起的風險,提高程式碼的可讀性和可維護性。
實踐方法
- 每個類儘量都有介面或抽象類,或者抽象類和介面兩者都具備
- 變數的表面型別儘量是介面或者是抽象類(有些不必,如xxxUtil類等)
- 任何類都不應該從具體類派生,儘量不要覆寫基類的方法
結合里氏替換原則
介面負責定義public屬性和方法,並且宣告與其他物件的依賴關係,抽象類負責公共構造部分的實現,實現類準確的實現業務邏輯,同時在適當的時候對父類進行細化。
在專案中,大家只要記住是“面向介面程式設計”就基本上抓住了依賴倒置原則的核心。
4. 介面隔離原則
定義
- 客戶端不應該依賴它不需要的介面
- 類間的依賴關係應該建立在最小的介面上
闡述
介面隔離原則與單一職責的審視角度是不相同的,單一職責要求的是類和介面職責單一,注重的是職責,這是業務邏輯上的劃分,而介面隔離原則要求介面的方法儘量少。
結構隔離原則的4層原則
- 介面要儘量小
- 介面要高內聚
- 定製服務(單獨為一個個體提供優良的服務)
- 介面設計是有限度的(靈活設計介面粒度大小)
5. 迪米特法則
定義
迪米特法則(Law of Demeter,LoD)也稱為最少知識原則(Least Knowledge Principle,LKP):一個物件應該對其他物件有最少的瞭解。
闡述
通俗地講,一個類應該對自己需要耦合或呼叫的類知道得最少,你(被耦合或呼叫的類)的內部是如何複雜都和我沒關係,那是你的事情,我就知道你提供的這麼多public方法,我就呼叫這麼多,其他的我一概不關心。
迪米特法則的幾層含義
- 只和朋友交流(出現在成員變數、方法的輸入輸出引數中的類稱為成員朋友類,而出現在方法體內部的類不屬於朋友)
- 朋友間也是有距離的
- 是自己的就是自己的(如果一個方法放在本類中,既不增加類間關係,也對本類不產生負面影響,就放置在本類中)
6. 開閉原則
定義
一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉。
闡述
開閉原則告訴我們應儘量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有的程式碼來完成變化,它是為軟體實體的未來事件而制定的對現行開發設計進行約束的一個原則。
重要性
開閉原則是最基礎的一個原則。有以下好處:
- 方便測試
- 提高複用性
- 提高可維護性
- 符合面向物件開發技術
實現方法
- 抽象約束
- 通過介面或抽象類約束擴充套件,對擴充套件進行邊界限定,不允許出現在介面或抽象類中不存在的public方法
- 引數型別、引用物件儘量使用介面或者抽象類,而不是實現類
- 抽象層儘量保持穩定,一旦確定即不允許修改
- 儘量用配置引數控制程式的行為(如spring和strust的配置檔案)
總結
六個原則如下:
- Single Responsibility Principle:單一職責原則
- Open Closed Principle:開閉原則
- Liskov Substitution Principle:里氏替換原則
- Law of Demeter:迪米特法則
- Interface Segregation Principle:介面隔離原則
- Dependence Inversion Principle:依賴倒置原則
把這6個原則的首字母(里氏替換原則和迪米特法則的首字母重複,只取一個)聯合起來就是SOLID(solid,穩定的),其代表的含義也就是把這6個原則結合使用的好處:建立穩定、靈活、健壯的設計,而開閉原則又是重中之重,是最基礎的原則,是其他5大原則的精神領袖。
遵循這6大設計原則基本上可以應對大多數變化,適當時候可以進行擴充,但是也並不侷限於這6大設計原則。