
想像一個沒有塔台的機場:每架飛機要自己跟其他所有飛機溝通,確認不會撞在一起。三架飛機要互相通訊 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 協調流程。它們不需要知道彼此的存在。

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 群組的管理員——大家有事找管理員,管理員統一處理。只是管理員太忙的時候,群組就癱瘓了。