重溫《深入淺出設計模式》心得整理 (Book Review of Head First Design Pattern, Summary)
2020-07-17
將近三週的時間,將近完成重溫進度的 90 %,在最後 Summary 各模式的回顧並且筆記書中所提及的 OOP 原則,並紀錄書中尚未詳細介紹的模式,留待之後繼續實踐。同時也謹記書中最後的提醒:設計模式作為一種在一般性的情境、目標與解決方案下所被發現的結構,模式的使用並不是絕對與唯一,模式背後的 OOP 原則如果就能夠精準且保有彈性的解決問題,未必要加入模式讓專案變得複雜。
之後的學習規劃不以模式本身為主,而是進入 MVC 的框架,從框架的原始碼中發現設計模式,用設計模式理解 MVC 框架,讓兩者相輔相成。
模式回顧
策略模式
- 原則:利用多型 (Polymorphism) 並以實踐介面 (Interface) 的方式來設計程式,這樣可以保持系統變動時候的彈性;將可以互換的行為封裝起來。
- 實作:將程式碼抽取成介面,並以實作介面的方式開發;執行期的型別以介面為型別,發揮多型的效用。
工廠模式
- 原則:由次類別決定要建立的 Concrete Class;允許客戶建立物件的家族、而無須指定他們的 Concrete Class。
- 實作:將程式碼中生成物件的 if else 抽離成獨立類別,以專門的類別負責條件式生成物件。
裝飾者模式
- 原則:將物件包裝起來提供新的行為。
- 實作:裝飾者與被裝飾者實踐共同的介面;裝飾者使用合成的方式包含被裝飾者。
命令模式
- 原則:將請求封裝成為物件。
- 實作:Invoker 利用合成的方式擁有實作命令介面的類別集合,負責佇列與執行命令;命令類別利用合成的方式擁有 Receiver 為真正的邏輯演算法的執行者;Client 是負責初始化命令以及組裝 Receiver。
合成模式
- 原則:令客戶面對個別物件與物件的集合時仍夠採取一致的處理方式。
- 實作:葉衍生類別與子集合衍生類別實踐共同介面;子衍生集合類別利用合成的方式指向孫衍生類別。
反覆器模式
- 原則:令物件在集合之中走訪時,不需要顯示其演算邏輯。
- 實作:ICollection 介面與 IIterator 介面,Client 同時擁有兩者,並呼叫 IIterator 的公有方法; ICollection 的衍生類別要回傳實作 IIterator 的物件。
外觀模式
- 原則:提供一個簡化一群類別的操作方式的介面。
- 實作:利用合成的方式,將一群類別的調用方式包裝在表象類別中,提供精簡的方法供外界使用。
狀態模式
- 原則:封裝以狀態為基礎的行為,並依據狀態的不同多型地使用行為方法。
- 實作:狀態作為一種類別,實踐它的衍生類別實踐介面的方法。Client 在狀態轉換上,多型地使用衍生類別的方法。
轉接器模式
- 原則:將物件封裝以相容其他介面。
- 實作:將要轉接的對象 (target) 作為介面 (Interface) ,衍生類別 (adapter) 實踐此介面,並且合成一個要被轉型的類別 (adaptee)
樣板方法模式
- 原則:由衍生類別決定如何實踐演算法中的步驟。
- 實作:抽象化類別中相似的演算步驟為抽象類別,並令衍生類別繼承及實作抽象類別。
代理人模式
- 原則:將物件包裝起來,用以控制對物件的存取。
- 實作:
單體模式
- 原則:將物件包裝起來,用以控制對物件的存取。
- 實作:
HeadFirst 未提及的其他模式
- Brdige Pattern
- Builder Pattern
- Chain Of Responsibility Pattern
- Flyweight Pattern
- Interpreter Pattern
- Mediator Pattern
- Memento Pattern
- Prototype Pattern
- Visitor Pattern
模式的分類
生成 Generate
- Singleton
- Builder
- Abstract Factory
- Factory Method
- Prototype
行為 Behavior
- Mediator
- Visitor
- Template Method
- Interpreter
- Chain of Responsibility
- Stable
- Strategy
- State
- Iterator
- Memento
- Observer
結構 Structure
- Proxy
- Bridge
- Facade
- Composite
- Adapter
- Decorator
- Flyweight
OOP 原則
✔️將變動的部分封裝起來
✔️多用合成,少用繼承
✔️讓需要互動的物件之間的關係鬆綁
✔️類別應該對需求保持開放;應該對既有的程式碼修改保持關閉
✔️依賴抽象,不要依賴具象類別
✔️最小知識原則
✔️類別只有一個理由可以改變
✔️好萊塢守則,低階(具象)元件可以掛勾到系統上,但必須由高階(抽象)元件決定何時呼叫