中介者模式通过中介者对象封装对象交互以降低耦合:定义Mediator接口及ConcreteMediator实现消息路由;同事类Colleague通过weak_ptr持有中介者,避免循环引用;使用string键的map注册同事并转发消息;完整C++17示例可编译运行。

一、定义中介者接口并实现具体中介者类
中介者模式通过引入一个中介对象来封装一系列对象之间的交互,使各对象不需要显式地相互引用,从而降低耦合度。中介者接口声明了用于协调同事对象通信的通用方法,具体中介者类则持有对所有同事对象的引用,并在接收到某一方请求时,决定将消息转发给哪些同事。
1、创建抽象中介者类 Mediator,声明 pure virtual 函数 handleSend 和 handleReceive;
2、定义具体中介者 ConcreteMediator,继承自 Mediator,在构造函数中接收所有同事对象指针并保存;
3、在 ConcreteMediator 的 handleSend 实现中,根据发送方身份和消息类型,调用对应同事对象的 receive 方法;
4、确保每个 handleSend 调用仅触发目标同事的 receive,不直接调用其他同事的 send 方法。
二、设计抽象同事基类与具体同事子类
同事类不直接与其他同事通信,而是将请求委托给中介者。抽象同事基类持有一个中介者指针,在构造时注入,所有通信均通过该指针完成,从而切断同事间的直接依赖关系。
1、声明抽象类 Colleague,包含 protected 成员 std::shared_ptr
2、在 Colleague 构造函数中接受 std::shared_ptr
3、定义虚函数 send(const std::string& msg, const std::string& to) 和 receive(const std::string& msg),前者调用 mediator_->handleSend(this, msg, to),后者为纯虚函数供子类实现;
4、派生两个具体同事类 UserA 和 UserB,各自重写 receive,内部仅处理自身逻辑,不出现任何对 UserA 或 UserB 的直接实例调用或头文件包含。
三、使用智能指针管理对象生命周期避免循环引用
中介者持有同事指针,同事又持有中介者指针,若全部使用 std::shared_ptr 则会导致引用计数永不归零。需在同事类中对中介者使用 std::weak_ptr,仅在需要通信时临时 lock 获取有效 shared_ptr。
1、将 Colleague 中的 mediator_ 类型改为 std::weak_ptr
2、修改 Colleague::send 实现:先调用 mediator_.lock(),判断返回值是否非空,若为空则丢弃消息并返回,禁止解引用空指针;
3、ConcreteMediator 内部仍使用 std::shared_ptr
4、UserA 和 UserB 的构造函数参数类型同步改为 std::weak_ptr
四、实现基于字符串标识的消息路由机制
中介者需根据接收方名称字符串,将消息准确投递给对应同事对象。该机制不依赖 RTTI 或模板特化,仅通过预注册的名称映射表完成查找,支持运行时动态增删同事(本例简化为固定注册)。
1、在 ConcreteMediator 私有成员中添加 std::map<:string std::shared_ptr>> colleagues_;
2、提供 registerColleague(const std::string& name, std::shared_ptr
3、handleSend 中解析 to 参数,以之为 key 查找 colleagues_,查不到时静默忽略,不抛异常也不断言失败;
4、查到后调用对应 colleague->receive(msg),确保该调用发生在同一线程且不引发重入。
五、编写可编译运行的完整源码示例
该示例包含全部必要头文件、无外部依赖,可在支持 C++17 的编译器上直接编译。主函数创建中介者实例,构造两个用户同事并注册,随后模拟一次跨用户消息发送流程,验证解耦效果。
1、包含
2、定义 Mediator 抽象类及 ConcreteMediator 实现,含 registerColleague 与 handleSend;
3、定义 Colleague 基类及 UserA、UserB,各自 receive 输出带前缀的日志;
4、main 函数中使用 make_shared 构造 ConcreteMediator,再构造 UserA 和 UserB 并注册,最后调用 user_a->send("Hello from A", "UserB");
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











