設計模式 引言

📢 本文由 gemini-3-flash-preview 翻譯

「每一個設計模式都描述了一個在我們周圍不斷重複發生的問題,以及該問題解決方案的核心。這樣一來,你就能一次又一次地使用該方案而不必做重複勞動」。設計模式的核心在於提供了相關問題的解決方案,使得人們可以簡單方便地複用成功的設計和體系結構。

設計模式一般有以下 4 個基本要素:

  1. 模式名稱 (Pattern Name):一個助記名,它用一兩個詞來描述模式的問題、解決方案和效果。
  2. 問題 (Problem):問題描述了應該在何時使用模式。
  3. 解決方案 (Solution):解決方案描述了設計的組成成分、它們之間的相互關係及各自的職責和協作方式。
  4. 效果 (Consequences):效果描述了模式應用的效果及使用模式應權衡的問題。

設計模式確定了所包含的類別(Class)和實例(Instance),它們的角色、協作方式以及職責分配。每一個設計模式都集中於一個特定的物件導向設計問題或設計要點,描述了什麼時候使用它,在另一些設計約束條件下是否還能使用,以及使用的效果和如何取捨。按照設計模式的目的可以分成三大類:

建立型模式與物件的建立有關;結構型模式處理類別或物件的組合;行為型模式對類別或物件怎樣分配職責進行描述。

設計模式-英文

建立型結構型行為型
類別工廠方法模式轉接器模式 (類別)解釋器模式
範本方法模式
物件抽象工廠模式
生成器模式
原型模式
單例模式
轉接器模式 (物件)
橋接模式
組合模式
裝飾模式
外觀模式
享元模式
代理模式
責任鏈模式
命令模式
迭代器模式
中介者模式
備忘錄模式
觀察者模式
狀態模式
策略模式
訪問者模式

建立型設計模式

建立型模式抽象化了實例化過程,它們幫助一個系統獨立於如何建立、組合和表示它的那些物件。一個類別建立型模式使用繼承改變被實例化的類別,而一個物件建立型模式將實例化委派給另一個物件。

隨著系統演化得越來越依賴於物件組合(Composition)而不是類別繼承,建立型模式變得更為重要。當這種情況發生時,重心從對一組固定行為的硬編碼 (Hard-coding) 轉移為定義一個較小的基本行為集,這些行為可以被組合成任意數目的更複雜行為,這樣建立有特定行為的物件要求的不僅僅是實例化一個類別。

在這些模式中有兩個不斷出現的主旋律:

  1. 它們都將關於該系統使用哪些具體類別的資訊封裝起來。
  2. 它們隱藏了這些類別的實例是如何被建立和放在一起的。整個系統關於這些物件所知道的是由抽象類別所定義的介面(Interface)。

因此,建立型模式在「為什麼被建立」、「誰建立它」、「它是怎樣被建立的」以及「何時建立」這些方面給予了很大的靈活性。它們允許用結構和功能差別很大的「產品」物件配置一個系統。配置可以是靜態的 (即在編譯時指定),也可以是動態的 (在執行時期)。

結構型設計模式

結構型設計模式涉及如何組合類別和物件以獲得更大的結構。結構型類別模式採用繼承機制來組合介面或實作。一個簡單的例子是採用多重繼承方法將兩個以上的類別組合成分一個類別,結果這個類別包含了所有父類別的性質。這一模式尤其有助於多個獨立開發的類別庫協同工作。其中一個例子是類別形式的 Adapter (轉接器) 模式。一般來說,轉接器使得一個介面與其他介面相容,從而給出了多個不同介面的統一抽象。為此,類別轉接器對一個 adaptee 類別進行私有繼承。這樣,轉接器就可以用 adaptee 的介面表示它的介面。

結構型物件模式不是對介面和實作進行組合,而是描述了如何對一些物件進行組合,從而實現新功能的一些方法。因為可以在執行時刻改變物件組合關係,所以物件組合方式具有更大的靈活性,而這種機制用靜態類別組合是不可能實現的。

行為型設計模式

行為模式涉及演算法和物件間職責的分配。行為模式不僅描述物件或類別的模式,還描述它們之間的通訊模式。這些模式刻畫了在執行時期難以追蹤的、複雜的控制流。它們將使用者的注意力從控制流轉移到物件間的聯繫方式上來。

行為類別模式使用繼承機制在類別間分派行為。其中 Template Method (範本方法) 較為簡單和常用。範本方法是一個演算法的抽象定義,它逐步地定義該演算法,每一步呼叫一個抽象操作或一個原語操作(Primitive operation),子類別定義抽象操作以具體實作該演算法。另一種行為類別模式是 Interpreter (解釋器),它將一個文法表示為一個類別層次,並實作一個解釋器作為這些類別實例上的一個操作。

行為物件模式使用物件組合而不是繼承。一些行為物件模式描述了一組對等的物件怎樣相互協作以完成其中任一個物件都無法單獨完成的任務。這裡一個重要的問題是對等的物件如何互相了解對方。對等物件可以保持顯式的對對方的參照,但那會增加它們的耦合度。在極端情況下,每一個物件都要了解所有其他的物件。Mediator (中介者) 在對等物件間引入一個 mediator 物件以避免這種情況的出現。mediator 提供了鬆耦合所需的間接性。

推薦閱讀

https://refactoringguru.cn/design-patterns