結構型模式關注類與物件的組合方式,核心在於透過繼承與組合建立靈活的結構。PHP 物件模型支援介面實作、類繼承與物件組合三種關係,結構型模式即在此基礎上演化。本文系統梳理七大結構型模式分類、核心意圖與適用場景,幫助開發者快速選型。
三者目標皆為降低耦合,但切入點不同:
| 模式 | 核心意圖 | 關鍵結構 | 典型場景 |
|---|---|---|---|
| 適配器 | 將不相容介面轉換為客戶期望介面 | Adapter 實作 Target 介面,持有 Adaptee 實例 | 第三方庫整合、舊系統介面兼容、多資料庫驅動統一 |
| 橋接 | 將抽象與實現分離,使兩者可獨立變化 | Abstraction 持有 Implementor 介面,M×N → M+N 類別 | 跨平台 GUI、訊息發送(郵件/簡訊/推播)× 格式(文字/HTML/Markdown) |
| 外觀 | 為子系統提供統一高層介面,簡化客戶端使用 | Facade 委派給內部多個類別,隱藏複雜度 | 框架啟動類、Service Layer 封裝 Repository、簡化複雜 API |
三者皆實作相同介面,透明地為物件增加正交關注點,客戶端無感知:
| 模式 | 核心意圖 | 關鍵差異 | 典型場景 |
|---|---|---|---|
| 組合 | 將物件組成樹狀結構,統一「部分-整體」操作 | Container 與 Leaf 共用 Component 介面,Container 遞迴包含子節點 | 檔案系統、UI 元件樹、選單結構、組織架構 |
| 裝飾 | 動態為物件增加職責,避免子類爆炸 | Decorator 持有 Component,攔截呼叫並添加行為,可多層疊加 | IO 流過濾(壓縮/加密/緩存)、日誌記錄、快取、HTTP 中介軟體 |
| 代理 | 為物件提供替身,控制存取(建立時機/權限/遠程) | Proxy 持有 RealSubject,決定何時/如何委派,通常單層 | ORM 惰性載入、RPC Stub、圖片延遲載入、存取控制 |
需要統一介面嗎?
├── 是 → 需要樹狀結構? → 是 → 組合模式
│ └── 否 → 需要動態添加行為? → 是 → 裝飾模式
│ └── 否 → 需要控制存取/延遲建立? → 是 → 代理模式
│ └── 否 → 享元模式(共享細粒度物件)
└── 否 → 需要轉換介面? → 是 → 適配器模式
└── 否 → 需要抽象與實現分離? → 是 → 橋接模式
└── 否 → 需要簡化子系統介面? → 是 → 外觀模式
結構型模式提供七種經典組合策略,解決介面不兼容、抽象實現綁定、子系統複雜、樹狀結構、動態增強、存取控制、細粒度物件共享等問題。實務中常組合使用:如 Facade 內部使用 Adapter 整合第三方、Decorator 包裝 Proxy 增加日誌、Composite 節點使用 Flyweight 共享圖示。掌握各模式意圖與邊界,靈活組合,才能駕馭複雜系統架構。