跟我一起學習設計模式(一)總覽
Dessign Pattern Overview
目錄
Overview
在軟體工程中,設計模式(design pattern)是對軟體設計中普遍存在(反覆出現)的各種問題,所提出的解決方案。這個術語是由埃里希·伽瑪(Erich Gamma)等人在1990年代從建築設計領域引入到電腦科學的。
設計模式並不直接用來完成程式碼的編寫,而是描述在各種不同情況下,要怎麼解決問題的一種方案。面向對象設計模式通常以類別或對象來描述其中的關係和相互作用,但不涉及用來完成應用程式的特定類別或對象。設計模式能使不穩定依賴於相對穩定、具體依賴於相對抽象,避免會引起麻煩的緊耦合,以增強軟體設計面對並適應變化的能力。
Core Concepts
- 變化是復用的天敵,本質是找到變化,封裝變化,提高可復用性
- 如果一個系統所有點都在變化或者一直不變,是不能用設計模式來解決的
Design Principle
- 依賴倒置原則(DIP)
- 高層模組(穩定)不應該依賴於低層模組(變化),二者都應當依賴於抽象(穩定)
- 抽象(穩定)不應該依賴於實現細節(變化),實現細節應該依賴於抽象
- 開放封閉原則(OCP)
- 對擴展開放,對更改封閉
- 類模組應該是可擴展的,但是不可修改
- 單一職責原則(SRP)
- 一個類應該僅有一個引起它變化的原因
- 變化的方向隱含著類的責任
- Liskov替換原則(LSP)
- 子類必須能夠替換它們的基類(IS-A)
- 繼承表達類型抽象
- 介面隔離原則(ISP)
- 不應該強迫客戶程式依賴它們不用的方法
- 介面應該小而完備
- 優先使用對象組合,而不是類繼承
- 類繼承通常為 白箱復用,對象組合通常為 黑箱復用
- 繼承在某種程度上破壞了封裝性,子類弗雷耦合程度高
- 而對象組合則只要求被組合的對象具有良好定義的介面,耦合度低
- 封裝變化點
- 使用封裝來創建對象之間的分界層,讓設計者可以在分界層的一側進行修改,而不會對另一側產生不良的影響,從而實現層次間的松耦合
- 針對介面編程,而不是針對實現編程
- 不將變數類型聲明為某個特定的具體類,而是聲明為某個介面
- 客戶程式無需或獲知對象的具體類型,只需要知道對象所具有的介面
- 減少系統中各部分的依賴關係,從而實現 「高內聚,低耦合」 的類型設計方案
Refactoring to Patterns
-
靜態 ==》動態
-
早綁定 ==》晚綁定
-
繼承 ==》 組合
-
編譯時依賴 ==》 運行時依賴
-
緊耦合 ==》
GOF-23
- 從目的來看
- 創建型模式:將對象的部分創建工作延遲到子類或其他對象,從而應對需求變化為對象創建時具體類型實現引來的衝擊
- 結構型模式:通過類繼承或者對象組合獲得更靈活的結構,從而應對需求變化為對象的結構帶來的衝擊
- 行為型模式:通過類繼承或者對象的組合來劃分嘞與對象間的職責,從而應對需求變化 為多個交互的對象帶來的衝擊
Encapsulate Change
組件協作
- Template Method
- Observer/Event
- Strategy
單一職責
- Decorator
- Bridge
對象創建
- Factory Method
- Abstract Factory
- Prototype
- Builder
對象性能
- Singleton
- Flyweight
介面隔離
- Facade
- Proxy
- Mediator
- Adapter
狀態變化
- Memento
- State
數據結構
- Composite
- Iterator
- Chain if Resposibility
行為變化
- Command
-
- Vistor
領域問題
- Interpreter
接下來會對每個模式進行詳解,特點是搞清楚來龍去脈,不用死記硬背,做到瞭然於胸

