
你去餐廳吃飯,會自己跑去廚房跟廚師說「先幫我洗菜、然後切、然後炒、最後擺盤」嗎?不會。你跟服務生說「一份牛排」就好了。
Facade Pattern 就是那個服務生。
先講結論
Facade 在複雜子系統外面包一個簡單介面。呼叫端只要用一個 method,Facade 內部幫你協調所有子系統的互動。子系統的複雜度被隱藏了,使用者不需要知道。
classDiagram class OrderFacade { -inventory : InventoryManager -payment : PaymentProcessor -shipping : ShippingService +placeOrder(productId, amount, address) Result } class InventoryManager { +checkStock(productId) boolean } class PaymentProcessor { +processPayment(amount) boolean } class ShippingService { +arrangeShipping(address) boolean } OrderFacade --> InventoryManager OrderFacade --> PaymentProcessor OrderFacade --> ShippingService note for OrderFacade "統一入口\n隱藏子系統複雜度"
沒有 Facade 的世界
// 呼叫端要自己知道「先查庫存、再扣款、再出貨」的順序
// 而且每個用到訂單流程的地方都要寫一遍
const inventory = new InventoryManager();
const payment = new PaymentProcessor();
const shipping = new ShippingService();
if (inventory.checkStock('PROD-001')) {
if (payment.processPayment(99.99)) {
shipping.arrangeShipping('台北市信義區');
}
}這段 code 散落在十個不同的 controller 裡,哪天付款流程要加一步「風控檢查」——你要改十個地方。
有 Facade 的世界

class OrderFacade {
constructor() {
this.inventory = new InventoryManager();
this.payment = new PaymentProcessor();
this.shipping = new ShippingService();
}
placeOrder(productId, amount, address) {
if (!this.inventory.checkStock(productId)) {
return { success: false, message: 'Out of stock' };
}
if (!this.payment.processPayment(amount)) {
return { success: false, message: 'Payment failed' };
}
this.shipping.arrangeShipping(address);
return { success: true, message: 'Order placed successfully' };
}
}
// 呼叫端只要一行
const orderSystem = new OrderFacade();
orderSystem.placeOrder('PROD-001', 99.99, '台北市信義區');要加風控檢查?改 OrderFacade 就好,呼叫端完全不用動。
Facade vs Mediator:差在哪?
兩個都是「協調多個物件」,但 Facade 是單向的(呼叫端 → Facade → 子系統),Mediator 是雙向的(物件 ↔ Mediator ↔ 物件)。Facade 簡化入口,Mediator 管理互動。
Facade Pattern 就是「我不想知道你們內部怎麼搞的,給我一個按鈕按下去就對了」。只是那個按鈕背後的 Facade 越長越胖的時候,它就變成另一個問題了。