1. 程式人生 > >設計模式之禪_6大設計原則

設計模式之禪_6大設計原則

單一職責原則

定義

應該有且只有一個原因引起類的變更

里氏替換原則

定義

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

如果子類不能完整地實現父類的方法,或者父類的某些方法在子類中已經發生“畸變”,則建議斷開父子繼承關係,採用依賴、聚集、組合等關係代替繼承。

四個原則:
1. 子類必須完全實現父類的方法
2. 子類可以有自己的個性
3. 覆蓋或實現父類的方法時,輸入引數可以被放大
4. 覆蓋或實現父類方法時,輸出結果可以被縮小

最佳實踐

採用里氏替換原則時,儘量避免子類的“個性”,因為當把子類當做父類使用時,子類的“個性”被抹殺,如果子類單獨來使用,又不能發揮繼承的多型特性。

依賴倒置原則

在java中的表述是:(抽象:介面或者抽象類;細節:抽象的實現類)
1. 模組之間的依賴通過抽象發生,實現類之間不發生直接的依賴關係
2. 介面和抽象類不依賴實現類
3. 實現類依賴抽象類或介面
簡而言之:面向介面程式設計

依賴的方式

  1. 建構函式傳遞依賴物件。通過建構函式宣告依賴物件,建構函式注入。
  2. setter方法傳遞依賴物件。在抽象中設定setter方法宣告依賴關係,就是setter依賴注入
public interface A{
    public void setB(B foo);//B是依賴的物件,B也可能是抽象
    ...
}
  1. 介面宣告依賴物件。在介面的方法中宣告依賴物件
public interface A{
    public void function(B foo);
    ...
}

最佳實踐

  1. 每個類儘量都有介面或抽象類。抽象是實現依賴倒置的前提
  2. 變數的表面型別儘量是抽象。即使用細節來例項化抽象物件
  3. 任何類都不應從具體類派生
  4. 儘量不要覆寫基類已經實現的方法。如AbstractCollection
  5. 結合里氏替換原則使用。介面負責定義public屬性和方法,並且宣告與其他物件的依賴關係,抽象類負責公共構造部分的實現,實現類準確的實現業務邏輯,同時在適當的時候對父類進行細化最好的例子是java的util包

總結

倒置是指抽象間的依賴關係,而不是細節之間的依賴關係(我們把細節的依賴提高到抽象間的依賴,提升了依賴的層次,實現了倒置)。

依賴倒置是6個設計原則中最難實現的原則,是實現開閉原則的重要途徑,依賴倒置原則沒有實現,就別想實現對擴充套件開放,對修改關閉。

介面隔離原則

定義:
1. 客戶端依賴他不需要的介面
2. 類間的依賴關係應該建立在最小的介面上

介面隔離原則要求介面的方法儘量的少,不應該建立大而全的介面,應該是小而精。即便介面遵循了單一職責原則,也應該分析方法的內聯性,拆分大的介面,使其成為幾個遵循單一職責原則的小介面。

最佳實踐

  1. 一個介面只服務於一個子模組或業務邏輯
  2. 通過業務邏輯壓縮介面中的public方法
  3. 已經被汙染的介面儘量去修改,如果變更風險大,用介面卡模式進行轉化

迪米特法則

一個物件應該對其他物件有最少的瞭解。

一個類只和朋友類交流,不與陌生類交流。類與類之間的關係建立在類間的,而不是方法間。(朋友類:出現在成員變數、方法的輸入輸出引數中的類。而出現在方法體內部的類不屬於朋友類)因此,一個業務類或模型類的方法中儘量不要出現其他業務類或模型類例項,應該傳參實現。

開閉原則

一個軟體實體如類、模組和函式應該對外擴充套件開放,對修改關閉。

相關推薦

設計模式_6設計原則

單一職責原則 定義 應該有且只有一個原因引起類的變更 里氏替換原則 定義 所有引用基類的地方必須能透明的使用其子類的物件 如果子類不能完整地實現父類的方法,或者父類的某些方法在子類中已經發生“畸變”,則建議斷開父子繼承關係,採用依賴、聚集

設計模式(里氏替換原則)2018-10-19

介面與抽象類的區別: 介面卡模式:使用不同介面的類所提供的服務為客戶端提供它所期望的介面。 實現: 有一個 MediaPlayer 介面和一個實現了 MediaPlayer 介面的實體類 AudioPlayer。預設情況下,AudioPl

設計模式》-1.六大原則

1.單一職責原則: 定義:應該有且僅有一個原因引起類的變更 好處: 1.類的複雜性降低,實現什麼職責都有清晰明確的定義; 2.可讀性提高,複雜性降低; 3.可維護性提高,可讀性提高; 4.變更引起的風險降低。變更是必不可少的,如果介面的單一職責做得好,一個介面修改只對相應的實

設計模式——六大設計原則解讀

面向對象 文件 引用 serial 輸出 ble 實例化 客戶 壟斷 一、單一職責原則(Single Responsibility Principle,SRP) 1. 單一職責原則定義 應該有且僅有一個原因引起類的變更。 2. 單一職責原則好處 類的復雜性降低,

設計模式單一職責原則

最近在看<<設計模式之禪>>感覺這本書很是不錯的,demo雖然簡單但是確實很明瞭,感覺很有必要自己再敲一遍 單一職責原則 demo: https://github.com/sanyinchen/UMLDemo 如果一個類有多於一個的動機被改變,那麼

設計模式六大設計原則下篇

本文主要講迪米特法則和開閉原則。 一、迪米特法則 1.定義 迪米特法則也稱最少知道原則,雖然名字不同,但描述的是同一個規則:一個物件應該對其他物件有最少的瞭解。通俗地講,一個類應該對自己需要耦合或呼叫的類知道得最少,你(被耦合或呼叫的類)的內部是如何複雜都和我沒關係,那是你的事情,我就知道你提供的這麼多pub

設計模式(1)-設計準則

精簡 是個 依賴關系 項目 開閉 結果 bubuko 自己的 HR   最近幾周一直都在看設計模式之禪,看的過程當中,發現大多數的設計模式在平時編碼過程當中使用到了,當時沒意識到這就是設計模式的一種,翻看自己以前的代碼,有些設計顯然和設計模式的標準有出入,但是個人認為設計模

設計模式(6)-單件模式

文章目錄 一、單件模式的實現 二、在併發下單件模式的改進 2.1、使用閉鎖測試單件模式的正確性 2.2、使用同步鎖改進單件模式 2.3、使用二重檢查加鎖來改進單件模式

設計模式(5)-介面卡模式

文章目錄 一、介面卡模式是什麼 二、把鴨子“適配”為狗 三、把列舉介面適配為迭代器介面 更多關於設計模式的文章請點選:設計模式之禪(0)-目錄頁 介面卡模式是面向物

設計模式(4)-工廠模式

文章目錄 一、簡單工廠模式 1.1、單一new方式 1.2、簡單工廠模式 二、抽象工廠及工廠方法 2.1、將簡單工廠改造成抽象工廠 2.2、為抽象工廠

設計模式(3)-裝飾者模式

文章目錄 一、裝飾者模式的特點 二、裝飾者模式的使用情景 三、裝飾者模式的一般關係圖 四、裝飾者模式的程式碼實現 五、裝飾者模式使用的設計原則 六、I/O流-典型的裝飾者模式 七、裝飾

設計模式(2)-觀察者模式

文章目錄 一、什麼是觀察者模式 二、通過設計氣象站模組來說明觀察者模式 2.1、觀察者模式設計的一般類圖 2.2、觀察者模式帶來的鬆耦合 2.3、氣象站模組需求 2.4、使用

設計模式(1)-策略模式

文章目錄 一、進一步的改進 二、用策略模式組織類關係例項 更多關於設計模式的文章請點選:設計模式之禪(0)-目錄頁 一、進一步的改進 上面的動物園例子似乎已經足夠地完善了,但是仔

設計模式學習筆記10--模板方法模式

1.模板方法模式    定義一個操作中的演算法的框架,而將一些步驟延遲到子類中。使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟.   類圖:              

設計模式學習筆記09--代理模式(動態代理)

1.動態代理     動態代理還是屬於設計模式--代理模式的一種,代理類在程式執行時建立的代理方式被成為動態代理。動態代理是在實現階段不用關心代理誰,而在執行階段才指定代理哪一個物件。相對來說,自己寫代理類的方式就是靜態代理。現在有一個非常流行的名稱叫做面向橫切面程式設計,也

設計模式學習筆記08--代理模式

1.代理模式     是一個使用率非常高的模式。代理模式也叫委託模式,他是為其他物件提供一種代理以控制對這個物件的訪問     類圖:代理主題角色和具體的主題角色具有相同的抽象主題介面        

設計模式》-5.抽象工廠模式

抽象工廠模式 定義: 為建立一組相關或相互依賴的物件提供一個介面,而且無需指定它們的具體類 抽象產品類 public abstract class AbstractProductA { //每個產品的共有方法 public void shareMethod () {

設計模式》-4.工廠方法模式的擴充套件

1.靜態工廠模式(簡單工廠模式) 其實就是去掉了抽象工廠類,然後定義一個工廠類的建立方法設定為靜態方法簡化了工廠類的建立   public class Factory{ public static <T extends Product> T create(C

設計模式》-3.工廠設計模式

工廠設計模式 定義: 定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類 通用程式碼 //抽象產品類 (也可以是功能介面) public abstract class Product { //產品的公共方法 public voi

設計模式》-2.單例設計模式

單例設計模式 定義: 確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項 通用程式碼: public class Singleton{ private static Singleton singleton = new Singleton(); //私