概述#

Structural pattern 關注的是如何將 class 和 object 組合(compose)成更大的結構。根據組合的方式,可分為兩類:

  • Structural class pattern:使用繼承來組合介面或實作。例如 multiple inheritance 將多個 class 混合為一,或 class 形式的 Adapter 透過 private 繼承來統一不同介面
  • Structural object pattern:使用物件組合來實現新功能。物件組合的彈性在於可以在執行期動態變更組合方式,這是靜態 class 組合做不到的

七種 Structural Pattern 一覽#

Pattern說明
Adapter讓一個 class 的介面符合另一個介面的期望,使原本不相容的 class 能夠合作
Bridge將物件的抽象(abstraction)與實作(implementation)分離,使兩者能獨立變化
Composite建構由 primitive 和 composite 物件組成的樹狀階層,讓客戶端能一致地處理個別物件與組合物件
Decorator以遞迴組合的方式動態地為物件附加額外職責,每個 Decorator 都符合元件介面並轉發訊息,可在轉發前後執行額外行為
Facade為一個子系統提供統一的高階介面,讓子系統更容易使用
Flyweight透過共享來高效支援大量細粒度物件。Flyweight 物件不持有 context-dependent state,所需的額外資訊在使用時傳入
Proxy為另一個物件提供代理或佔位符,可用於遠端存取、延遲載入、存取控制等場景

Structural pattern 之間有許多關聯。例如 Composite 和 Decorator 都使用遞迴組合,Proxy 和 Decorator 的結構相似但意圖不同,Facade 和 Adapter 都封裝了既有介面。各 pattern 的詳細比較請見各子章節的「Related Patterns」段落。