cover

想像一個沒有塔台的機場:每架飛機要自己跟其他所有飛機溝通,確認不會撞在一起。三架飛機要互相通訊 3 次,十架飛機就是 45 次。這就是物件間直接互相呼叫的下場——蜘蛛網式耦合。

加一個塔台(Mediator),所有飛機只跟塔台溝通,問題就解決了。

先講結論

Mediator 讓物件之間不再直接互相呼叫,所有溝通都透過中介者。好處是:任何一個物件被替換或移除,其他物件完全不受影響。

classDiagram
    class OrderMediator {
        -inventory : Inventory
        -payment : Payment
        -shipping : Shipping
        +processOrder(order) Result
    }
    class Inventory {
        +check(items) boolean
    }
    class Payment {
        +process(amount) boolean
    }
    class Shipping {
        +arrange(address) void
    }
    OrderMediator --> Inventory
    OrderMediator --> Payment
    OrderMediator --> Shipping
    note for OrderMediator "協調各模組互動\n模組間不直接通訊"

實戰:訂單處理協調

庫存、付款、物流三個模組各做各的事,由 Mediator 協調流程。它們不需要知道彼此的存在。

Mediator 模式:中介者協調多個部門

class Inventory {
    async check(items) {
        console.log('檢查庫存:', items);
        return true;
    }
}
 
class Payment {
    async process(amount) {
        console.log('處理付款:', amount);
        return true;
    }
}
 
class Shipping {
    async arrange(address) {
        console.log('安排出貨:', address);
    }
}
 
class OrderMediator {
    constructor() {
        this.inventory = new Inventory();
        this.payment = new Payment();
        this.shipping = new Shipping();
    }
 
    async processOrder(order) {
        if (!await this.inventory.check(order.items)) {
            return { success: false, message: '庫存不足' };
        }
        if (!await this.payment.process(order.amount)) {
            return { success: false, message: '付款失敗' };
        }
        await this.shipping.arrange(order.address);
        return { success: true, message: '訂單完成' };
    }
}
 
const mediator = new OrderMediator();
mediator.processOrder({
    items: ['item1', 'item2'],
    amount: 199.99,
    address: '台北市信義區',
});

Mediator vs Facade:不是一樣的東西嗎?

乍看之下很像,但:

  • Facade:簡化介面,呼叫方向是單向的(外部 → Facade → 子系統)
  • Mediator:協調互動,物件之間可以透過 Mediator 雙向溝通

Facade 是「給外面一個簡單入口」,Mediator 是「讓裡面的人不要互相打電話」。

小心 God Object

Mediator 的風險是它會越來越胖——所有協調邏輯都塞進去,最後變成一個什麼都管的 God Object。如果你的 Mediator 超過 200 行,該考慮拆分了。


Mediator 就像 LINE 群組的管理員——大家有事找管理員,管理員統一處理。只是管理員太忙的時候,群組就癱瘓了


延伸閱讀