中介者模式(Mediator Pattern)是一种行为型设计模式,其核心思想是通过中介对象封装一组对象的交互规则,使各对象不再显式相互引用。如同现实中的机场塔台调度飞机起降,该模式将原本复杂的网状通信结构转化为星型结构,很大程度上降低了对象的耦合度。
从早期GUI事件处理到现代微服务架构,中介者模式始终扮演着关键角色。在Qt框架中,信号槽机制实质是中介者模式的变体,来实现组件之间的通信解耦。
四大核心组件:
抽象中介者(Mediator)
定义通信接口规范,如:
class Mediator {
public:
virtual void relayMessage(Colleague* sender, string msg) = 0;
};
具体中介者(ConcreteMediator)
实现具体协调逻辑,维护同事对象集合。如聊天室中介者需管理所有用户实例。
抽象同事类(Colleague)
持有中介者引用,定义通用接口:
class Colleague {
protected:
Mediator* mediator;
public:
virtual void send(string msg) = 0;
};
具体同事类(ConcreteColleague)
实现业务逻辑,通过中介者转发请求。如GUI按钮触发事件需通过对话框中介协调。
数据流向特征:相比观察者模式的广播机制,中介者模式具有定向路由能力。
复杂交互系统
如航空管制系统,塔台中介者协调飞机、地勤、气象等数十个子系统的交互。
GUI组件管理
Qt中对话框控件之间的数据验证、联动显示等场景,适合采用中介者模式。
分布式通信中间件
消息队列服务本质是中介者,协调生产者与消费者的消息传递。
案例1:智能家居控制中枢
class SmartHomeMediator : public Mediator {
vector<Device*> devices;
public:
void relayMessage(Device* sender, string cmd) override {
if(cmd == "BATH_START") {
getDevice("Curtain")->close();
getDevice("Speaker")->playMusic();
}
}
};
上面的例子就是在模拟当用户触发洗澡模式时,中介者自动协调窗帘、音响等设备。
案例2:多人在线游戏大厅
游戏房间作为中介者,处理玩家匹配、状态同步、战斗结算等复杂交互,避免玩家对象直接耦合。
定义抽象中介接口
class TradeMediator {
public:
virtual void processOrder(Order* order) = 0;
};
构建具体中介实现
class StockExchange : public TradeMediator {
map<string, Trader*> traders;
public:
void addTrader(Trader* t) { /*...*/ }
void processOrder(Order* order) override {
// 执行撮合交易逻辑
}
};
实现同事类
class Trader : public Colleague {
StockExchange* exchange;
public:
void placeOrder(Order* order) {
exchange->processOrder(order);
}
};
注册表机制
class AdvancedMediator {
unordered_map<string, function<void(string)>> handlers;
public:
void registerHandler(string event, auto handler) {
handlers[event] = handler;
}
void relay(string event, string param) {
handlers.at(event)(param);
}
};
此方案支持动态注册事件处理器,提升扩展性。
中介类成为系统瓶颈,其故障会导致整体瘫痪。例如某电商系统曾因订单中介服务宕机损失千万。
中介者过度承担业务逻辑,演变为"上帝对象"。据说别人实测结果显示,超过20个处理方法的中介者类Mediator维护成本会成倍的激增。
多层转发导致延迟累积。在高频交易系统中,中介者模式可能引入不可接受的微秒级延迟。
// 采用责任链模式实现中介者负载均衡
class ClusterMediator : public Mediator {
vector<Mediator*> nodes;
int current = 0;
public:
void relayMessage(...) override {
nodes[current++ % nodes.size()]->relayMessage(...);
}
};
通过多个中介实例来分担压力,各自做一部分事情,提升系统可用性。
比如某社交平台,通过批处理使中介吞吐量提升数倍。
核心优势:
别小看中介者模式,现在在物联网、分布式系统等领域将会持续焕发新生,据预测,该模式在C++系统中的采用率将会在这些了领域大幅提升。掌握了这一模式,开发人员将获得破解复杂系统交互难题的金钥匙之一。