cover

Facade 模式:讓複雜系統變簡單

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隱藏子系統複雜度"

使用情境

  1. 訂單流程:庫存、付款、物流整合。
  2. 第三方 API 整合:多套 API 封裝成一致入口。
  3. 大型系統分層:減少使用端對子系統細節的依賴。

實作範例

Facade 模式:單一入口簡化複雜子系統

class InventoryManager {
  checkStock(productId) {
    console.log(`Checking stock for product: ${productId}`);
    return true;
  }
}
 
class PaymentProcessor {
  processPayment(amount) {
    console.log(`Processing payment: $${amount}`);
    return true;
  }
}
 
class ShippingService {
  arrangeShipping(address) {
    console.log(`Arranging shipping to: ${address}`);
    return true;
  }
}
 
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, '台北市信義區');

優點

  • 對外介面簡潔
  • 降低子系統耦合
  • 使用端學習成本低

缺點

  • Facade 可能逐漸膨脹
  • 修改子系統可能影響 Facade

延伸閱讀