外觀模式為子系統提供一個統一的高層介面,隱藏內部複雜性。本文以「品茗流程」為例:無外觀時客戶需自行準備茶葉、茶具、煮茶工具;引入 TeaHouse 外觀後,一鍵完成全流程。展示如何將複雜對象創建、初始化順序、協作邏輯封裝於單一入口。
// 子系統組件
class Tea { public Tea(String name) { System.out.println("準備茶葉:" + name); } }
class TeaSet { public TeaSet() { System.out.println("準備茶具"); } }
class TeaTools { public TeaTools() { System.out.println("準備煮茶工具"); } }
// 外觀角色:茶社
class TeaHouse {
public void serveTea() {
new Tea("龍井");
new TeaSet();
new TeaTools();
System.out.println("請品茗");
}
}
// 客戶端
public class Demo {
public static void main(String[] args) {
System.out.println("=== 無外觀:客戶自行協調 ===");
new Tea("龍井");
new TeaSet();
new TeaTools();
System.out.println("品茗");
System.out.println("\n=== 有外觀:茶社一站式服務 ===");
new TeaHouse().serveTea();
System.out.println("品茗");
}
}
TeaHouse,知曉子系統功能與調用順序Tea、TeaSet、TeaTools,實現具體功能,不知外觀存在| 無外觀 | 有外觀 |
|---|---|
| 客戶需知曉所有子系統類 | 客戶僅依賴外觀介面 |
| 客戶負責對象創建順序、協作邏輯 | 邏輯封裝於外觀內部 |
| 子系統變更波及所有客戶端 | 變更隔離於外觀,客戶端無感 |
| 難以替換子系統實現 | 外觀內部可靈活切換實現 |
String.split() 內部封裝 Pattern.compile()、Matcher 等正則引擎複雜性getConnection() 隱藏驅動註冊、連接池選擇、協議協商| 模式 | 核心意圖 | 介面關係 |
|---|---|---|
| 外觀 | 簡化複雜子系統調用 | 定義新介面,比子系統更高層 |
| 代理 | 控制訪問、延遲初始化、權限校驗 | 實現與真實對象相同介面 |
| 適配器 | 轉換不兼容介面 | 實現客戶期望的目標介面 |
Pattern 可直接用)外觀模式是「簡化複雜性」的首選模式,合理劃分子系統邊界並提供精心設計的外觀,能顯著提升 API 易用性與系統可維護性。