cover

你去餐廳吃飯,會自己跑去廚房跟廚師說「先幫我洗菜、然後切、然後炒、最後擺盤」嗎?不會。你跟服務生說「一份牛排」就好了。

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 的世界

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 越長越胖的時候,它就變成另一個問題了


延伸閱讀