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

設計模式六大原則的理解

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)

定義 : 一個軟體實體如類,模組和函式應該對擴充套件開放,對修改關閉,開閉原則也是其他五個原則的基石