图说设计模式之中介者模式:减少对象间耦合的设计策略
【免费下载链接】design_patterns 图说设计模式 项目地址: https://gitcode.com/gh_mirrors/de/design_patterns
在复杂系统开发中,对象间直接通信往往导致代码耦合度高、维护困难。当中介者模式(Mediator Pattern)出现后,这一问题得到了系统性解决。本文将通过图说方式详解中介者模式的设计思想、实现方式及应用场景,帮助开发者掌握这一降低系统复杂度的关键策略。
模式动机:为何需要中介者?
传统对象交互模型中,多个对象通过直接引用建立通信,形成网状依赖结构。这种设计会导致:
- 系统结构复杂:修改一个对象需同步调整所有关联对象
- 可重用性差:对象依赖过多导致难以独立复用
- 扩展性低:新增功能需修改多处关联代码
中介者模式通过引入第三方协调者,将多对多关系转化为一对多关系,彻底解决上述痛点。官方文档对这一设计思想的阐述参见behavioral_patterns/mediator.rst。
模式定义与核心结构
中介者模式定义:用一个中介对象封装一系列对象交互,使各对象无需显式引用,从而降低耦合并独立改变交互方式。其核心结构包含四种角色:
- Mediator(抽象中介者):定义通信接口
- ConcreteMediator(具体中介者):实现协调逻辑
- Colleague(抽象同事类):定义同事对象接口
- ConcreteColleague(具体同事类):实现业务功能,通过中介者通信
交互流程:时序图解析
对象间通过中介者通信的典型流程如下:
- 同事对象向中介者发送请求
- 中介者根据协调逻辑处理请求
- 中介者将处理结果转发给其他同事
代码实现:核心组件剖析
具体中介者实现
中介者核心逻辑在ConcreteMediator中实现,负责维护同事对象引用并协调交互:
class ConcreteMediator : public Mediator {
private:
ConcreteColleagueA* colleagueA;
ConcreteColleagueB* colleagueB;
public:
void setColleagueA(ConcreteColleagueA* ca);
void setColleagueB(ConcreteColleagueB* cb);
void send(string message, Colleague* colleague) override;
};
void ConcreteMediator::send(string message, Colleague* colleague) {
if (colleague == colleagueA) {
colleagueB->notify(message);
} else {
colleagueA->notify(message);
}
}
同事对象实现
同事类通过中介者通信,无需知道其他同事存在:
class ConcreteColleagueA : public Colleague {
public:
ConcreteColleagueA(Mediator* mediator);
void send(string message);
void notify(string message);
};
void ConcreteColleagueA::send(string message) {
mediator->send(message, this);
}
void ConcreteColleagueA::notify(string message) {
cout << "同事A收到消息:" << message << endl;
}
主程序调用
int main() {
ConcreteMediator* mediator = new ConcreteMediator();
ConcreteColleagueA* colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB* colleagueB = new ConcreteColleagueB(mediator);
mediator->setColleagueA(colleagueA);
mediator->setColleagueB(colleagueB);
colleagueA->send("你好,B");
colleagueB->send("收到,A");
delete colleagueA;
delete colleagueB;
delete mediator;
return 0;
}
模式分析:中介者的双重职责
中介者承担两种核心角色:
1. 中转作用(结构性)
所有同事间通信必须通过中介者转发,消除直接引用。这种结构转变使系统拓扑从网状变为星形,如模式分析图所示:
2. 协调作用(行为性)
中介者封装交互规则,同事只需关注自身业务,无需了解全局逻辑。典型协调流程可见时序图示例:
优缺点与适用场景
主要优势
- 简化对象交互,将多对多转化为一对多
- 提高可维护性,集中管理交互逻辑
- 增强可扩展性,新增同事无需修改现有代码
潜在缺点
- 中介者可能演变为"上帝对象",承担过多职责
- 复杂中介逻辑可能降低系统性能
典型应用场景
- 多人聊天室系统(如虚拟聊天室实例)
- GUI组件交互(按钮、文本框等通过面板协调)
- 微服务架构中的服务注册中心
- MVC模式中的Controller角色
框架应用:MVC架构中的中介者
在经典MVC架构中,Controller本质上就是中介者:
- 视图(View)与模型(Model)不直接通信
- 所有交互通过控制器(Controller)中转
- 这种设计完全符合中介者模式思想
项目中相关的MVC实现参考structural_patterns目录下的示例代码。
总结与实践建议
中介者模式通过引入协调中心,有效解决了复杂系统的耦合问题。在实践中建议:
- 当中对象超过3个且存在多向交互时考虑使用
- 避免中介者过度膨胀,可结合职责链模式拆分逻辑
- 优先通过接口定义中介者通信协议
完整示例代码可查看code/Mediator/目录,包含从抽象接口到具体实现的完整代码树。通过掌握这一模式,开发者能够构建出更松散耦合、更易维护的系统架构。
【免费下载链接】design_patterns 图说设计模式 项目地址: https://gitcode.com/gh_mirrors/de/design_patterns
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考








