中介者模式用一個中介者對象封裝一系列對象交互,使各對象不顯式相互引用,從而降低耦合。它將網狀多對多依賴轉為星型一對多依賴,是處理複雜對象交互的利器。
notify(Colleague, event)。直接耦合版:A、B 互相持有引用,A.setNumber() 直接調用 B.setNumber(),修改擴散不可控。
中介者版:A、B 僅持有中介者引用,A.setNumber() 調用 mediator.AaffectB(),中介者統一協調 B 的變更。代碼見原文完整示例。
// 網狀:N 個對象最多 N*(N-1) 條依賴邊
A ↔ B, A ↔ C, B ↔ C, ...
// 星型:N 個對象僅 N 條依賴邊(指向中介者)
A → Mediator ← B
↓
C
| 優點 | 缺點 |
|---|---|
| 降低同事類耦合,符合迪米特法則 | 中介者膨脹:邏輯過於集中,成為「上帝類」 |
| 簡化對象交互,易於理解維護 | 間接性增加調試難度 |
| 交互邏輯集中,便於全局控制 | 不適用於簡單/穩定的對象關係 |
濫用後果:將原本清晰的直接調用強行拆解,反而增加複雜度。原則:僅當對象間形成難以維護的網狀依賴時引入。
中介者模式以「中心化協調」換取「去中心化耦合」。它是架構師手中的手術刀:用得好能化解依賴地獄,用不好會製造維護噩夢。決策前請量化:依賴邊數、變更頻率、團隊認知負荷。