設計模式簡介
設計模式簡介
概要
1995年,有四位小伙伴合著了一本書,書名叫做《設計模式:可復用面向對象軟件的基礎》里面共收錄了23種設計模式。
這23種設計模式,又可以根據設計的目的,分三大類型:創建型、結構型、行為型。下面分別來介紹各個類型下的設計模式。
每一個類型所包含的具體設計模式,總結在下圖當中:

下面分別來介紹各個類型下的設計模式。
一、創建型模式(5 種)
這一類設計模式的目的是用于創建對象。
包含了5種設計模式:
1. 工廠方法模式:子類決定實例化
2. 抽象工廠模式:抽象接口
3. 單例模式: 唯一實例
4. 原型模式: 原型實例,拷貝
5. 建造者模式:類和構造分離
二、結構型模式(7 種)
這一類設計模式的目的是優化不同類、對象、接口之間的結構關系。
包含了7種設計模式:
代理模式:代理控制
裝飾器模式:附加職責
橋接模式:抽象和實現分離
組合模式:整體-不分,樹形結構
適配器模式:轉換,兼容接口
外觀模式:對外統一接口
享元模式:細粒度,共享
其中有兩組設計模式很相似,但是側重點和適用場景各有不同,如下:
1) 裝飾器模式和代理模式很相似,不同點是裝飾器模式關注增強功能,代理模式關注控制訪問;
2)適配器模式和橋接模式很相似,不同點是適配器模式是事后補救,把不兼容接口適配起來,橋接是預設設計,將實現與抽象分類,支持獨立擴展
三、行為型模式(11 種)
這一類設計模式的目的是更好地實現類與類之間的交互以及算法的執行。包含了 11 種設計模式:
1. 觀察者模式:通知、自動更新
2. 策略模式:算法替換
3. 命令模式:日志記錄,可撤銷
4. 狀態模式:狀態變成類
5. 備忘錄模式:保存,恢復
6. 解釋器模式:解釋器,虛擬機
7. 迭代器模式:順序訪問,不暴露內部
8. 中介者模式:不直接引用
9. 訪問者模式:數據和操作分離
10. 模版方法模式: 模版方法
11. 職責鏈模式:傳遞請求,職責鏈接
其中有兩組設計模式很相似,但是側重點和適用場景各有不同,如下:
1)策略模式 VS 狀態模式,都是通過“上下文 + 接口 + 實現類”組合方式實現行為的封裝和變化,利用多態動態改變行為。區別是策略模式側重外部控制來決定選擇哪種策略,狀態模式側重自動或內部決定,且不同狀態之間有“流程依賴”。
2)職責鏈模式 VS 命令模式,都涉及“請求的處理”與“請求者和處理者的解耦”,區別是職責鏈模式側重多個候選處理者,命令模式側重請求封裝與調用解耦。
3)觀察者模式 VS 中介者模式,都涉及處理多個對象之間的交互關系,并解耦組件之間的直接通信。觀察者模式側重以“主題-訂閱者”方式實現一對多依賴,中介者模式側重所有組件通過一個中介進行交互,強調中心化協調,各組件不直接引用彼此。
四、常用的設計模式
常用的有單例模式、工廠模式、觀察者模式、建造者模式、策略模式、模版方法模式、裝飾器模式、職責鏈模式等
PS:補充一下面向對象的設計原則
1. 依賴倒置原則
依賴倒置原則(Dependency Inversion Principle,簡稱DIP)是面向對象設計中的一條原則,它是面向對象設計中的五個SOLID原則之一。該原則提出了兩個關鍵思想:
高層模塊不應該依賴于底層模塊,兩者都應該依賴于抽象。
抽象不應該依賴于具體,具體應該依賴于抽象。
說明:依賴倒置原則的目的是實現模塊之間的松耦合,提高系統的可維護性、可擴展性和可復用性。通過引入抽象層,高層次的模塊不需要關心底層模塊的具體實現細節,只需要依賴于抽象接口。
這樣,當底層模塊發生變化時,高層模塊不受影響,只需要保持對抽象的依賴關系。
2. 里氏替換原則
定義:子類型必須能夠替換掉他們的父類型 分析:子類擁有父類所有非private的行為和屬性,正因為有了里氏替換原則,使得繼承復用成為了可能,只有當子類可以替換掉父類,軟件單位的功能不受到影響時,父類才能真正被復用,而子類也能夠在父類的基礎上增加新的行為。
正是由于子類的可替換性才使得父類類型的模塊在無需修改的情況下就可以擴展
3. 迪米特原則
也叫最少知道原則,迪米特法則強調了類之間的松耦合
定義: 如果兩個類不必彼此直接通信,那么這兩個類就不應當發生直接的相互作用。如果其中一個類需要調用另一個類的某一個方法的話,可以通過第三者轉發這個調用
分析:類之間的耦合越弱,越有利于復用,一個處在弱耦合的類被修改,不會對有關系的類造成波及。
4. 開閉原則
一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。即一個軟件實體應該通過擴展來實現變化,而不是通過修改已有的代碼來實現變化。
在程序中對“擴展”開放,對“修改”封閉。如果每次業務改動都要增加新的if-else,就涉及對舊有代碼的修改,不但容易出錯,可讀性也不好。

浙公網安備 33010602011771號