設計模式 6大設計原則

2021-09-03 02:18:18 字數 2673 閱讀 9653

目錄

1、單一職責原則

2、黎克特制替換原則

3、依賴倒轉原則

4、介面隔離原則

5、迪公尺特法則

6、開閉原則

7、合成/聚合復用原則

single responsibility principle

應該有且僅有乙個原因引起類的變更。

乙個介面包含了兩個或多個職責,而且這兩個或多個職責的變化不相互影響。

面向介面程式設計,對外公布的是介面而不是實現類。

類的複雜性降低,實現什麼職責都有清晰明確的定義;

可讀性提高,複雜性降低,那當然可讀性提高了;

可維護性提高,那當然了,可讀性提高,那當然更容易維護了;

變更引起的風險降低,變更必不可少,介面要做的好的話,乙個介面修改只對相應的實現類有影響,與其他介面無影響,這個是對專案非常大的幫助。

單一職責使用於介面、類、方法。

介面一定要做到單一職責,類設計盡量只有乙個原因引起變化。

liskov substitution principle lsp

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

4層含義,如下:

1、子類必須完全實現父類的方法,在父類出現的地方,子類可以進行替換。

2、子類可以有自己的個性,在子類出現的地方,父類未必可以勝任。

3、覆蓋或實現父類的方法時輸入引數可以被放大,但用於背會被呼叫到。

4、覆蓋或實現父類的方法時輸出結果可以被縮小。

在類中呼叫其他類時務必要使用父類或介面,如果不能使用父類或介面,則說明類的設計已經違背了lsp原則。

可擴充套件性增強

dependence inversion princeple

模組之間依賴通過抽象發生,實現類之間不發生直接的依賴關係,其依賴關係是通過介面或抽象類產生的。

介面或抽象類不依賴實現類

實現類依賴介面或抽象類

一句話總結:面向介面程式設計

採用依賴倒置原則可以減少來之間的耦合性,提供系統的穩定性,降低並行開發引起的風險,提高**的可讀性和可維護性。

物件依賴關係有3種方式類傳遞:

1)建構函式傳遞依賴物件

2)setter方法傳遞依賴物件

3)介面宣告依賴

實踐經驗:

1)每個類盡量都有介面或抽象類,或者抽象類和介面都具備

2)變數的表面型別盡量是介面或者抽象類

3)任何類都不應該從具體類派生

4)盡量不要覆寫基類的方法

如果基類是乙個抽象類,而這個方法已經實現了,子類盡量不要覆寫。

類間依賴的是抽象,覆寫了抽象方法,對依賴的穩定性會有一定的影響。

5)結合黎克特制替換原則使用

黎克特制替換原則:父類出現的地方子類就能出現。

結合本章我們得出了乙個通俗的規則:介面負責定義public屬性和方法,並且宣告與其他物件的依賴關係。

抽象類負責公共構造部分的實現,實現類準確的實現業務邏輯,同時在適當的時候對父類進行細化。

inte***ce segregation principle

建立單一介面,不要建立龐大臃腫介面。介面要盡量細化,介面中的方法要盡量少。

與單一職責原則的區別:單一職責原則要求的是類和介面職責單一,注重的是職責,沒有要求介面的方法減少

介面是設計時對外提供的契約,通過分散定義多個介面,可以預防未來變更擴散,提供系統的靈活性和可維護性。

介面隔離原則和其它設計原則一樣,都是需要花費較多的時間和精力來進行設計和籌畫,但是它帶來了設計的靈活性,可以輕鬆應對需求變更。

介面隔離原則是對介面進行規範約束,包含以下四層含義:

1)介面盡量小。根據介面隔離原則拆分介面時,必須首先滿足單一職責原則。

2)介面要高內聚。高內聚就是提高介面、類、模組的處理能力,減少對外互動,即盡量少公布public方法。

3)定**務。給各個訪問者定**務。

4)介面設計是有限度的。

實踐經驗:

1)乙個介面只服務與乙個子模組或業務邏輯

2)通過業務邏輯壓縮介面中的public方法

3)已經被汙染了的介面,盡量去改,若變更風險較大,則採用介面卡模型進行轉化處理

4)了解環境,拒絕盲從。深入了解業務,最好的介面出自你手。

low of demeter

通俗的講,就是乙個類對自己需要耦合或呼叫的類應該知道最少。

深入理解迪公尺特法則:

1)只和朋友交流。

每個物件都必然會和其他物件有耦合關係,兩個物件之間的耦合就成為朋友關係。

這種關係比如組合、聚合、依賴等。

什麼是朋友類?出現在成員變數、方法的輸入輸出引數中的類被稱為成員朋友類。

2)朋友之間也是有距離的。

迪公尺特法則要求類「小氣」一點,盡量不要對外公布太多的public方法和非靜態的public變數,盡量內斂,多使用private、default、protected等訪問許可權,如果成員變數或方法能加上final關鍵字,就不要讓外部去改變它。

3)自己的就是自己的。

如果乙個方法能放在本類中,就不要放到其他類。

4)謹慎使用serializable。

對擴充套件開放,對修改關閉。簡單來說,只可增加,不可修改。

如果新物件的某些功能在別的已經建立好的物件裡面已經實現,那麼盡量使用別的物件提供的功能,使之成為新物件的一部分,而不要自己再建立。新物件通過向這些物件的委派達到復用已有的功能。

簡而言之,要盡量使用合成/聚合,盡量不適用繼承。

設計模式 6大設計原則

前往目錄 擴充套件時不改變原有 乙個抽象類被多個子類繼承並實現抽象方法,呼叫者取得抽象類物件並呼叫方法,main中對呼叫者傳入不同子物件來實現切換 拓展時加子類即可 能使用父類的地方一定能使用子類,正方形不是長方形。假設長方形設定寬比高小時自增,正方形繼承長方形方法後會死迴圈,因此根據此原則不能使用...

設計模式 6大設計原則

單一職責原則 srp single responsibility principle 優點 建議 介面一定要做到單一職責,類的設計盡量做到只有乙個原因引起變化。定義 所有引用基類的地方必須能透明地使用其子類物件。四層含義 建議 類中呼叫其他類時,務必使用父類或介面 否則說明違背了此原則。若子類不能完...

6大設計原則 23種設計模式

乙個類只負責一項職責,應該僅有乙個引起它變化的原因。優點 子類可以擴充套件父類的功能,但不能改變父類原有的功能。即任何基類可以出現的地方,子類一定可以出現,並且當用子類替換了基類後程式不受影響。含義 要求對抽象進行程式設計,不要對實現進行程式設計。實際程式設計中需要做到 建立單一介面,不要建立龐大臃...