定義:要求一個子系統的外部與其內部通信必須通過一個統一的外觀對象進行。外觀模式隱藏了子系統的複雜性,降低客戶端與子系統的耦合度,是「迪米特法則」(最少知識原則)的經典應用。
用戶下單看似簡單,實則牽動三大部門協同:
public class Customer {
public void shopping() {
Payment payment = new PaymentImpl();
Storage storage = new StorageImpl();
Transport transport = new TransportImpl();
String ware = payment.pay(28.0); // 付款
storage.pack(ware); // 打包
transport.deliver(ware); // 發貨
}
}
痛點:Customer 耦合三個具體類,流程邏輯硬編碼在業務代碼中。若新增「發票部」、「客服部」,shopping() 就要不斷修改,違反開閉原則。
public class Facade {
private Payment payment;
private Storage storage;
private Transport transport;
public Facade(Payment p, Storage s, Transport t) {
this.payment = p; this.storage = s; this.transport = t;
}
public void fastShopping() {
String ware = payment.pay(28.0);
storage.pack(ware);
transport.deliver(ware);
}
}
public class Customer {
private Facade facade;
public Customer(Facade facade) { this.facade = facade; }
public void shopping() { facade.fastShopping(); }
}
無 Facade:網狀耦合

有 Facade:星狀解耦

Spring 的 HibernateTemplate 就是典型外觀:
// 用戶只需一行代碼
List> list = hibernateTemplate.find("from User where name=?", "Tom");
// 內部封裝了繁瑣流程
Session session = sf.openSession();
Query query = session.createQuery(hql);
for (int i=0; i
客戶端無需關心 SessionFactory、Session、Query 等底層 API,極大降低了使用門檻。
JavaEE 分層架構中:
這正是「Service 作為 DAO 的外觀」:Controller 不直接訪問 DAO,由 Service 封裝事務邊界與業務組合,實現關注點分離。
| 維度 | 外觀模式 | 中介者模式 |
|---|---|---|
| 意圖 | 提供簡化接口,單向委託 | 協調多對象雙向交互,集中控制 |
| 耦合方向 | 客戶端 → Facade → 子系統 | 同事類 ↔ Mediator ↔ 同事類 |
| 子系統感知 | 子系統不知 Facade 存在 | 同事類知曉 Mediator 並主動調用 |