图说设计模式之中介者模式:减少对象间耦合的设计策略

图说设计模式之中介者模式:减少对象间耦合的设计策略

【免费下载链接】design_patterns 图说设计模式 【免费下载链接】design_patterns 项目地址: https://gitcode.com/gh_mirrors/de/design_patterns

在复杂系统开发中,对象间直接通信往往导致代码耦合度高、维护困难。当中介者模式(Mediator Pattern)出现后,这一问题得到了系统性解决。本文将通过图说方式详解中介者模式的设计思想、实现方式及应用场景,帮助开发者掌握这一降低系统复杂度的关键策略。

模式动机:为何需要中介者?

传统对象交互模型中,多个对象通过直接引用建立通信,形成网状依赖结构。这种设计会导致:

  • 系统结构复杂:修改一个对象需同步调整所有关联对象
  • 可重用性差:对象依赖过多导致难以独立复用
  • 扩展性低:新增功能需修改多处关联代码

中介者模式通过引入第三方协调者,将多对多关系转化为一对多关系,彻底解决上述痛点。官方文档对这一设计思想的阐述参见behavioral_patterns/mediator.rst

模式定义与核心结构

中介者模式定义:用一个中介对象封装一系列对象交互,使各对象无需显式引用,从而降低耦合并独立改变交互方式。其核心结构包含四种角色:

  • Mediator(抽象中介者):定义通信接口
  • ConcreteMediator(具体中介者):实现协调逻辑
  • Colleague(抽象同事类):定义同事对象接口
  • ConcreteColleague(具体同事类):实现业务功能,通过中介者通信

中介者模式类图

交互流程:时序图解析

对象间通过中介者通信的典型流程如下:

  1. 同事对象向中介者发送请求
  2. 中介者根据协调逻辑处理请求
  3. 中介者将处理结果转发给其他同事

中介者模式时序图

代码实现:核心组件剖析

具体中介者实现

中介者核心逻辑在ConcreteMediator中实现,负责维护同事对象引用并协调交互:

ConcreteMediator.h

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;
};

ConcreteMediator.cpp

void ConcreteMediator::send(string message, Colleague* colleague) {
    if (colleague == colleagueA) {
        colleagueB->notify(message);
    } else {
        colleagueA->notify(message);
    }
}

同事对象实现

同事类通过中介者通信,无需知道其他同事存在:

ConcreteColleagueA.h

class ConcreteColleagueA : public Colleague {
public:
    ConcreteColleagueA(Mediator* mediator);
    void send(string message);
    void notify(string message);
};

ConcreteColleagueA.cpp

void ConcreteColleagueA::send(string message) {
    mediator->send(message, this);
}

void ConcreteColleagueA::notify(string message) {
    cout << "同事A收到消息:" << message << endl;
}

主程序调用

main.cpp

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目录下的示例代码。

总结与实践建议

中介者模式通过引入协调中心,有效解决了复杂系统的耦合问题。在实践中建议:

  1. 当中对象超过3个且存在多向交互时考虑使用
  2. 避免中介者过度膨胀,可结合职责链模式拆分逻辑
  3. 优先通过接口定义中介者通信协议

完整示例代码可查看code/Mediator/目录,包含从抽象接口到具体实现的完整代码树。通过掌握这一模式,开发者能够构建出更松散耦合、更易维护的系统架构。

【免费下载链接】design_patterns 图说设计模式 【免费下载链接】design_patterns 项目地址: https://gitcode.com/gh_mirrors/de/design_patterns

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值