1、單一職責原則(Single Responsibility Principle)
定義 : 應該有且只有一個原因引起類的變化
注意 : 這里的類不光指類,也適用於方法和接口,比如我們常說的一個方法實現一個功能
2、里氏代換原則(Liskov Substitution Principle)
定義 : 只要父類出現的地方子類就一定可以出現,而且替換為子類也不會出現任何異常或錯誤,使用者不需要知道是父類還是子類.但是返回來就不行了,有子類出現的地方,
不一定能使用父類
使用規范 :
- 子類必須完全實現父類的方法,如果子類無法完全實現父類的方法,則建議斷開父子繼承關系,采用依賴 | 聚集 | 組合 等關系來代替
- 子類可以有自己的個性
- 覆蓋或實現父類的方法時,輸入參數可以被放大,比如父類中有一個方法的輸入參數是 HashMap,子類的參數可以是 Map 類型,這樣父類就可以被子類替換,如果反過來,則違背了里氏替換原則,所以子類中方法的前置條件必須與父類的
被覆寫的方法的前置條件相同或者更寬松
- 覆寫或實現父類的方法時,輸出結果可以被縮小,也就是說如果父類方法返回的類型 T,子類的相同方法(重載或覆寫)的返回值類型 S,S 和 T 要么同類型,要么 S 是 T 的子類;跟上面的道理一樣
注意 : 采用里氏替換原則時,盡量避免子類的"個性",一旦子類有了"個性",子類和父類的關系就會變得不好調和
3、依賴倒置原則(Dependence Inversion Principle)
定義 : 依賴倒置原則包含三個含義
- 高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象
- 抽象不應該依賴細節
- 細節應該依賴抽象
高層模塊和低層模塊比較好理解,每一個邏輯都是由原子邏輯組成的,不可分割的原子邏輯是低層模塊,原子邏輯再組裝就是高層模塊;
抽象指的是接口或者抽象類,兩者都不能直接實例化;
細節就是實現類,實現接口或繼承抽象類而產生的類就是細節,其特點是可以被實例化;
依賴倒置原則在 Java 中的實現是表現是:
- 模塊間的依賴通過抽象發生,實現類之間不發生直接的依賴關系,其依賴關系是通過接口或抽象類產生的;
- 接口或抽象類不依賴於實現類
- 實現類依賴接口或抽象類
這也是面向接口編程的精髓之一
遵循的規則 :
- 每個類盡量都有接口或抽象類,或者兩者都有
- 變量的表面類型盡量是接口或者抽象類
- 任何類都不應該從具體類派生
- 盡量不要覆寫基類的方法,如果基類是一個抽象類,而且這個方法已經實現了,子類盡量不要覆寫
- 結合里氏替換原則使用
- 接口負責定義 public 屬性和方法,並且聲明與其他對象的依賴關系,抽象類負責公共構造部分的實現,實現類准確的實現業務邏輯
4、接口隔離原則(Interface Segregation Principle)
我們先來看接口的定義 :
- 實例接口 : 在 Java 中聲明一個類,然后用 new 關鍵字產生一個實例,它是對一類事物的描述,可以看成是一個接口
- 類接口 : 使用 interface 定義的接口
隔離的的理解 :
- 客戶端不應該依賴它不需要的接口
- 類之間的依賴關系應該建立在最小的接口上
- 概括 : 建立單一接口,不要建立臃腫龐大的接口,也就是接口盡量細化,接口中的方法盡量少
這個是開閉原則的基礎,具體內容:針對接口編程,依賴於抽象而不依賴於具體。
接口隔離原則的約束條件 :
- 接口要高內聚,意思就是提高接口,類,模塊的處理能力,減少對外的交互,再具體一點就是在接口中盡量減少對外的 public 方法,通過業務邏輯壓縮接口中的 public 方法
- 定制服務,就是單獨為一個個體提供優良的服務,比如我們寫用戶模塊的時候,需要給用戶提供查詢信息,修改密碼,注冊用戶等信息,當管理員執行相同操作的時候,一般人會復用這些方法,
然后在這個的基礎上再增加管理員自己的方法,這種設計方法肯定是有問題的,這樣設計,當你修改了普通用戶調用的接口實現時,管理員的實現也會發生不可預測的改變,我們應該為管理
員單獨寫一個接口
- 接口設計是有限度的,接口的設計粒度越小,系統越靈活,這是肯定的,但靈活的同時帶來的問題是 結構復雜化,開發難度增加, 可維護性降低
- 一個接口只服務於一個子模塊或業務邏輯
- 已經被污染了的接口,盡量去修改 ,若修改的風險較大,則采用適配器模式進行轉化處理
- 了解環境,拒絕盲從,不要一味的去套設計模式,有的時候不用比用了更好,也不要去照搬別人的設計方法,他的方法到你這不一定效果就好,畢竟業務邏輯不一樣
5、迪米特法則(Demeter Principle)
定義 : 迪米特法則也叫最少知識原則,含義是 一個對象應該對其他對象有最少的了解,這個應該很好理解,就是降低各模塊之間的耦合
6、開閉原則(Open Close Principle)
定義 : 一個軟件實體如類,模塊和函數應該對擴展開放,對修改關閉,開閉原則也是其他五個原則的基石
