軟體開發中,客戶程式常與複雜子系統產生耦合,導致子系統變更波及客戶端。外觀模式提供統一高層介面,屏蔽內部複雜度,實現客戶端與子系統鬆耦合。
意圖:為子系統群提供一致介面,定義高層介面讓子系統更易用。(GoF)
示意物件圖:

消費者撥打單一客服專線 (外觀),客服代表整合訂貨、收銀、物流三部門介面,消費者無需知曉內部分工:

public class Bank { public bool HasSufficientSavings(Customer c, int amt) => true; }
public class Credit { public bool HasGoodCredit(Customer c) => true; }
public class Loan { public bool HasNoBadLoans(Customer c) => true; }
// 客戶端
var bank = new Bank(); var credit = new Credit(); var loan = new Loan();
var eligible = bank.HasSufficientSavings(c, 12000) && loan.HasNoBadLoans(c) && credit.HasGoodCredit(c);
客戶端與三子系統緊耦合,任一變更皆波及客戶端。
public class Mortgage {
private Bank _bank = new Bank();
private Loan _loan = new Loan();
private Credit _credit = new Credit();
public bool IsEligible(Customer cust, int amount) {
Console.WriteLine($"{cust.Name} applies for {amount:C} loan");
return _bank.HasSufficientSavings(cust, amount)
&& _loan.HasNoBadLoans(cust)
&& _credit.HasGoodCredit(cust);
}
}
// 客戶端
var mortgage = new Mortgage();
var eligible = mortgage.IsEligible(new Customer("Ann"), 125000);
客戶端僅依賴 Mortgage,內部子系統變更不影響客戶端。
典型四層架構:UI → Business Facade → Business Rule → Data Access。Facade 職責:接收 UI 輸入、判斷路由 (唯讀直達 DA / 寫入經 BR)、維護臨時狀態、回傳結果。


// UI
var categorySet = productSystem.GetCategories(categoryID);
// Facade
public CategoryData GetCategories(int categoryId) {
using (var da = new Categories()) return da.GetCategories(categoryId);
}
// UI
cartOrderData = (new OrderSystem()).AddOrder(cartOrderData);
// Facade
public OrderData AddOrder(OrderData order) {
new BusinessRules.Order().InsertOrder(order); return order;
}
// Business Rule 執行複雜驗證與計算後呼叫 DA
public bool InsertOrder(OrderData order) {
// 驗證運費、稅金、地址、付款資訊、明細小計...
using (var da = new DataAccess.Orders()) return da.InsertOrderDetail(order) > 0;
}
外觀模式聚焦簡化介面,屬架構層面模式而非單一類別層面。它為系統劃定清晰邊界,是分層架構設計中不可或缺的穩定器。