單一職責原則(SRP:Single Responsibility Principle)
定義:應該有且僅有一個原因引起類的變更,
優點:
- 類的復雜性降低;
- 可讀性提高;
- 可維護性提高;
- 變更引起的風險降低,
建議:介面一定要做到單一職責,類的設計盡量做到只有一個原因引起變化,
里氏替換原則(LSP:Liskov Substitution Principle)
定義:所有參考基類的地方必須能透明地使用其子類物件,
四層含義:
- 子類必須完全實作父類的方法
- 子類可以有自己的個性
- 覆寫或實作父類的方法時輸入引數可以被放大(子類引數是父類引數的基類)注:使用此規則多載父類函式,避免替換后呼叫子類方法,而不符合用戶預期
- 覆寫或實作父類的方法時輸出引數可以被縮小(子類回傳值是父類回傳值的派生類)注:引數串列相同時使用此規則構成重寫,符合預期;不同時構成多載,同上
建議:
類中呼叫其他類時,務必使用父類或介面;否則說明違背了此原則,
若子類不能完整地實作父類的方法,則建議斷開父子繼承關系,采用依賴、聚集、組合等關系替代繼承,
依賴倒置原則(DIP:Dependence Inversion Principle)
三層含義:
- 模塊間的依賴通過抽象產生,實作類之間不發生依賴關系,其依賴是通過介面或抽象類產生的;
- 介面或抽象類不依賴于實作類;
- 實作類依賴介面或抽象類,
簡而言之:面向介面編程
抽象是對實作的約束,對依賴者而言,也是一種契約,目的是保證所有細節不脫離契約的范疇,
依賴的三種寫法:
- 建構式傳遞依賴物件(建構式注入)
- Setter方法傳遞依賴物件(Setter依賴注入)
- 介面宣告依賴物件(介面注入)
建議:
- 每個類盡量有介面或抽象類
- 變數的表面型別盡量是介面或抽象類
- 任何類都不應該從具體類派生
- 盡量不要覆寫基類的方法
- 結合里氏替換原則使用
關于【倒置】:
“正置”:面向實作編程,開車依賴車,使用電腦依賴電腦,
根據系統設計的需要產生了抽象間的依賴,替代了人們傳統思維中事務間的依賴,“倒置”就是從這里產生的,
介面隔離原則(Interface Segregation Principle, ISP)
定義:客戶端不應該依賴它不需要的介面,一個類對另一個類的依賴應該建立在最小的介面上,(介面盡量細化,同時介面中的方法盡量少,)
四層含義:
- 介面要盡量小:根據介面隔離原則拆分介面時,首先必須滿足單一職責原則,
- 介面要高內聚:減少對外的互動,盡量少公布public方法,
- 定制服務:只提供訪問者需要的方法
- 介面設計是有限度的:介面設計注意適度,控制粒度與復雜度的平衡
迪米特法則(Law of Demeter,LoD/Least Knowledge Principle,LKP)
定義:一個物件應該對其他物件有最少的了解,
四層含義:
- 只和朋友交流:耦合的關系-組合、聚合、依賴等(方法實作時盡量不引入一個類中不存在的物件)
- 朋友間也是有距離的:合理運用封裝性,封裝過度細化的介面作為public方法暴露給朋友
- 是自己的就是自己的:如果一個方法可以放在本類中,既不增加類間關系,也不對本類產生負面影響,那就放在本類中,
- 謹慎使用Serializable(序列化)
核心:
類間解耦,弱耦合,但過度使用會產生大量中轉或跳轉類,需反復權衡找到平衡點,跳轉次數盡量控制在兩次以內,
開閉原則(Open Closed Principle, OCP)
定義:軟體中的物件(類,模塊,函式等等)應該對于擴展是開放的,但是對于修改是封閉的,
優點:
- 提高復用性
- 提高可維護性
- 面向物件開發的要求
如何使用
- 抽象約束:不允許出現抽象類中不存在的public方法;引數型別、參考物件盡量使用抽象類,而不是實作類;抽象層盡量保持穩定,
- 元資料控制模塊行為:從檔案或資料庫中獲取元資料
- 制定專案章程
- 封裝變化:將相同的變化封裝到一個抽象類中;將不同的變化封裝到不同的抽象類中,
總結
SRP:單一職責原則
OCP:開閉原則
LSP:里氏替換原則
LoD:迪米特法則
ISP:介面隔離原則
DIP:依賴倒置原則
將六大原則首字母鏈接,就是SOLID(穩定的),建立穩定、靈活、健壯的設計,開閉原則是其他5大原則的精神領袖,
開閉原則是一個終極目標,任何人都無法百分百做到,我們只是盡量去朝這個目標去做,實際作業時也要結合具體情況,
參考文獻:《設計模式之禪》--秦小波
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/230248.html
標籤:設計模式
下一篇:設計模式-6大設計原則
