1. 程式人生 > >解讀設計模式六大原則

解讀設計模式六大原則

單一職責原則

定義

全稱:Single Responsibility Principle,簡稱是SRP。就一個類而言,應該僅有一個引起它變化的原因。簡單來說,一個類中應該是一組相關性很高的函式、資料的封裝。

好處
- 類的複雜性降低
- 可讀性提高
- 可維護性提高
小結
單一職責適用於介面、類、方法。建議是介面一定要做到單一職責,類的設計儘量做到只有一個原因引起變化。

里氏替換原則

定義

全稱:Liskov Substitution Principle ,簡稱是LSP。
第一種定義:如果對每一個型別為S的物件o1,都有型別為T的物件o2,使得以T定義的所有程式P在所有的物件o1都代換成o2時,程式P的行為沒有發生變化,那麼型別S是型別T的子型別。
第二種定義

:所有引用基類的地方必須能透明地使用其子類的物件。

要點

  • 里氏替換原則就是依賴於繼承、多型兩大特性。只要父類能出現的地方子類就可以出現,而替換為子類也不會產生任何錯誤或異常,使用者可能根本就不需要知道是父類還是子類。但是,反過來就不行了,有子類出現的地方,父類未必就能適應。
  • 在類中呼叫其他類時務必要使用父類或介面,如果不能使用父類或介面,則說明類的設計已經違背了LSP原則
  • 如果子類不能完整地實現父類的方法,或者父類的某些方法在子類中已經發生“畸變”,則建議斷開父子繼承關係,採用依賴、聚集、組合等關係代替繼承
  • 里氏替換原則的核心原理是抽象,通過抽象建立規範,具體的實現在執行時替換掉抽象,保證系統的拓展性、靈活性。開閉原則和里氏替換原則往往是生死相依,通過里氏替換來達到到對拓展開放,對修改關閉的效果。

小結
採用里氏替換原則的目的就是增強程式的健壯性,版本升級時也可以保持非常好的相容性。即使增加子類,原有的子類還可以繼續執行。在實際專案中,每個子類對應不同的業務含義,使用父類作為引數,傳遞不同的子類完成不同的業務邏輯。

依賴倒置原則

定義

全稱:Dependence Inversion Principle,簡稱DIP。依賴倒置原則指代了一種特定的解耦形式,使的高層次的模組不依賴於低層次的模組的實現的實現細節的目的,依賴模組被顛倒了。

關鍵點

  1. 高層模組不應該依賴低層模組,兩者都應該依賴其抽象
  2. 抽象不應該依賴細節
  3. 細節應該依賴抽象。

要點
依賴倒置原則的本質就是通過抽象(介面或抽象類)使各個類或模組的實現彼此獨立,不互相影響,實現模組間的鬆耦合。
規則


1. 每個類儘量都有介面或抽象類,或者抽象類和介面兩者都具備
2. 變數的表面型別儘量是介面或者是抽象類
3. 任何類都不應該從具體類派生
4. 儘量不要覆寫基類的方法
5. 結合里氏替換原則使用

介面負責定義public屬性和方法,並且宣告與其他物件的依賴關係,抽象類負責公共構造部分的實現,實現類準確的實現業務邏輯,同時在適當的時候對父類進行細化

介面隔離原則

定義

全稱:InterfaceSegregation Principle. 簡稱ISP.
定義:客戶端不應該依賴它不需要的介面。另一種定義:類間的依賴關係應該建立在最小的介面上

規則

  • 一個介面只服務於一個子模組或業務邏輯
  • 通過業務邏輯壓縮介面中的public方法,介面時常去回顧
  • 已經被汙染了的介面,儘量去修改,若變更的風險較大,則採用介面卡模式進行轉化處理

迪米特法則

全稱:Law of Demeter,簡寫:LOD. 也稱為最少知識原則。一個物件應該對其他物件有最少的瞭解。通俗地講,一個類應該對自己需要耦合或呼叫的類知道得最少。

要點
儘量不要對外公佈太多的public方法和非靜態的public變數,儘量內斂,多使用private、package-private、protected等訪問許可權。
小結

核心觀念就是類間解耦,弱耦合,只有弱耦合了以後,類的複用率才可以提高

開閉原則

定義

全稱:Open Close Principle,縮寫是OCP。軟體中的物件(類、模組、函式等)應該對於擴充套件是開放的,但是,對於修改是封閉的。

要點
開閉原則對擴充套件開放,對修改關閉,並不意味著不做任何修改,低層模組的變更,必然要有高層模組進行耦合,否則就是一個孤立無意義的程式碼片段。