設計模式學習地圖

前言

學習設計模式之前,最好對OO(物件導向)相關知識有一定的了解,這樣可以快速了解每個設計模式的運作機制,下圖為設計模式背景知識地圖:

設計模式背景知識地圖

物件導向三大特性

物件導向三大特性(繼承、封裝、多型)是物件導向的核心,幾乎每個設計模式都有用到物件導向特性。

繼承

繼承讓你基於其他類別建立類別,避免重複和反覆出現的程式碼。使用繼承的時機是當一個物件的行為類似於另一個物件的行為時,而不是只因為IS-A關係成立。

封裝

封裝是將類別的實作隱藏起來,好讓它容易使用與改變。封裝讓類別以黑箱的方式,提供服務給它的使用者,但不開放程式碼讓使用者改變或者以錯誤的方式使用它。封裝是遵循OCP的關鍵技術。

多型

多型與繼承緊密相關,當一個類別繼承另一個類別時,多型讓子類別能替代父類別。多型讓不同的物件可以執行相同的方法,但要透過自己實作程式碼來執行。

物件導向設計原則

物件導向原則是能被應用到設計或撰寫程式碼的工具或技術,讓程式碼更好維護、更具彈性、或者更易擴展。

SOLID

Robert C. Martin(Bob大叔)於2009年提出,將五個物件導向設計原則歸類成SOLID。

單一職責原則(SRP,Single Responsibility Principle)

系統裡的每一個物件應該具有單一責任,所有的物件服務都應該聚焦在實現單一責任上。

開閉原則(OCP:Open-Closed Principle)

類別允許擴展而開放,禁止修改而關閉。

Liskov 替代原則(LSP,Liskov Substitution Principle)

子型別(subtype)必須能替代其基礎型別(base type)。

  • 繼承必須確保父型別所擁有的特質(特性與方法),對子型別仍然成立

  • 當子類別可以替代父類別,才算具有合理的繼承關係

介面隔離原則(ISP,Interface Segregation Principle)

將過胖的介面拆分成更小和更具體的介面,不應該強迫用戶端實作對其而言無用的方法。

  • 目的是為了解耦合

依賴反轉原則(DIP,Dependency Inversion Principle)

  1. 高層模組不應該依賴於低層模組,兩者都應該依賴抽象

  2. 抽象不應該依賴細節,細節應該依賴抽象。

迪米特法則(LoD,Law of Demeter)

如果兩個類別不必彼此直接通信,那麼這兩個類別就不應該有直接的相互作用。如果其中一個類別需要調用另一個類別的某一個方法的話,可以透過第三者轉發這個調用。

  • 強調『在類別的設計結構上,每一個類別都應當盡量降低成員的使用許可權』

  • 也叫知識最少原則

針對介面而寫,不要針對實作

寫程式是針對超型態(supertype)而寫。 也就是上面依賴反轉原則的白話文意思。

多用物件複合技術,少用類別繼承

使用合成比繼承具有很大的彈性,可以將演算法封裝成類別,也可以『在執行期動態地改變行為』。

UML

UML(Unified Modeling Language 統一塑模語言)描述了系統的類別集合,類別的屬性和類別之間的關係

類別圖

類別圖可以讓你一眼知道這個類別叫什麼,有甚麼屬性和方法,清楚的表達該類別所要做的事

類別圖的關聯(associations)

類別之間的關聯,讓你一眼看出兩個類別(物件)它們彼此的參考關係

繼承的三個替代方案

繼承 vs. 合成

合成讓你使用來自「一組其他類別」的行為,並且可以在執行期間切換該行為。

繼承 vs. 委派

委派是將特定工作的責任委交給另一個類別或方法。

繼承 vs. 泛型

泛型讓你可以無須言明它會用到那些其他型別,等到真正要用時再以參數的方式帶進方法或類別裡。

設計模式閱讀順序

喬舒亞·凱列夫斯基(Joshua Kerievsky)主持了大約三年的設計模式讀書會,提出了一份設計模式閱讀順序:

Factory Method → Strategy → Decorator → Composite → Iterator → Template Method → Abstract Factory → Builder → Singleton → Proxy → Adapter → Bridge → Mediator → Observer → Chain of Responsibility → Memento → Command → Prototype → State → Visitor → Flyweight → Interpreter → Facade

八大常見設計模式

如果你一次想到有23個設計模式,就想放棄的話,可以從最簡單、最常見的八個設計模式下手

  1. Abstract Factory

  2. Adapter

  3. Composite

  4. Decorator

  5. Factory Method

  6. Observer

  7. Strategy

  8. Template Method

設計模式學習資源(書籍)

網路上有許多介紹設計模式的網站,但都是各別講某個設計模式,如果你想要有系統性的一次看完全部的設計模式,以下是推薦的學習資源:

物件導向設計模式,可再利用物件導向軟體之要素

  • GoF設計模式原著

  • 詳細的介紹每個設計模式的目的、動機、結構、效果、實作、相關模式等

  • 因為是原著,閱讀難度相對較高

深入淺出設計模式

  • 利用視覺化、遊戲化、提問式教學等刺激大腦的活動,讓你不知不覺就把所讀記在腦海中

  • 因為做了許多刺激大腦的活動,閱讀所需時間相對漫長

  • 時隔10幾年,終於在今年9月出了第二版

大話設計模式

  • 從兩個工程師的對話中,了解設計模式與生活的關聯

  • 閱讀體驗非常輕鬆,適合任何時候閱讀

無瑕的程式碼,敏捷完整篇(Agile Principles,Patterns,and Practices)

  • 無瑕的程式碼作者(Bob大叔)將工作實務上遇到的問題,利用實作設計模式來解決。

  • 書中介紹了UML圖、設計模式原則、敏捷開發

最後一個是網路資源,內容包含全部的GoF設計模式,方便快速認識一個新的設計模式

Refactoring.Guru-Design Pattern

  • 網址在這

  • 支援多語言(人類語言與程式語言)

  • 列出每個設計模式的精華,閱讀時間相對短

書名

難度

程式語言

實體書

電子書

物件導向設計模式,可再利用物件導向軟體之要素(典藏版)

★★★★★

C++

V

X

無瑕的程式碼 敏捷完整篇:物件導向原則、設計模式與C#實踐

★★★★

C#

V

X

Refactoring.Guru-Design Pattern

★★★

多語言

V

深入淺出設計模式(第二版)

★★

Java

V

X

大話設計模式

C#

X

X

總結

無論你選擇用什麼方式學習設計模式,最重要的是自己動手寫程式,寫過一遍才知道設計模式如何運作。