中介者模式通过引入中介者对象解耦多个对象间的直接交互。其核心角色包括抽象中介者、具体中介者、抽象同事类和具体同事类,C++中需用指针避免循环引用,典型应用如聊天室或UI控件联动。
中介者模式(Mediator Pattern)的核心是解耦多个对象之间的直接交互,把它们的通信集中到一个中介者对象中统一处理。在 C++ 中,通过定义抽象中介者、具体中介者、抽象同事类和具体同事类,就能清晰实现这一结构。
需要四个基本组成部分:
notify(Colleague*, std::string event)
ncreteMediator(具体中介者):持有所有同事对象的引用或指针,实现具体协调逻辑,决定事件发生时谁该响应、如何响应Mediator*),不直接依赖其他同事,只通过中介者通信mediator->notify(this, "event"),接收通知时重写响应逻辑模拟两个用户(UserA 和 UserB)通过 ChatRoom(中介者)发送消息:
#include#include #include class Mediator; class Colleague { protected: Mediator mediator_; public: explicit Colleague(Mediator m) : mediator_(m) {} virtual void send(const std::string& msg) = 0; virtual void receive(const std::string& msg) = 0; };
class Mediator { public: virtual void notify(Colleague* sender, const std::string& msg) = 0; };
class ChatRoom : public Mediator { std::vector
participants_; public: void registerParticipant(Colleague& c) { participants_.push_back(&c); }
void notify(Colleague* sender, const std::string& msg) override { for (auto* p : participants_) { if (p != sender) { // 不发给自己 p-youjiankuohaophpcnreceive("[ChatRoom] " + std::string(sender-youjiankuohaophpcnname()) + ": " + msg); } } }};
class User : public Colleague { std::string name_;
public: User(const std::string& n, Mediator* m) : Colleague(m), name_(n) {}
const char* name() const { return name_.c_str(); } void send(const std::string& msg) override { mediator_-youjiankuohaophpcnnotify(this, msg); } void receive(const std::string& msg) override { std::cout zuojiankuohaophpcnzuojiankuohaophpcn name_ zuojiankuohaophpcnzuojiankuohaophpcn " received: " zuojiankuohaophpcnzuojiankuohaophpcn msg zuojiankuohaophpcnzuojiankuohaophpcn "\n"; }};
int main() { ChatRoom room; User alice("Alice", &room); User bob("Bob", &room);
room.registerParticipant(alice); room.registerParticipant(bob); alice.send("Hi Bob!"); bob.send("Hello Alice!"); return 0;}
使用要点与注意事项
实际项目中需注意以下细节:
- 中介者应尽量保持“无知”——不暴露同事内部状态,只传递必要事件名或数据包,避免强耦合
- 同事类中建议用
Mediator*而非std::shared_ptr,防止循环引用;若需生命周期绑定,可用std::weak_ptr- 复杂系统中可扩展为事件总线(Event Bus):用字符串/枚举标识事件类型,支持订阅-发布机制
- UI 场景常见应用:窗口中多个控件(按钮、文本框、下拉框)联动时,用一个 DialogMediator 统一处理变更响应,而非让按钮直接操作文本框
何时选用中介者模式
适合以下典型场景:
- 一组对象以定义良好但复杂的方式进行通信,导致相互依赖关系网状化、难以复用
- 想定制一个分布在多个类中的行为,又不想生成大量子类(相比观察者,中介者更强调“协调决策”)
- 需要在不修改现有类的前提下,动态改变对象间的交互逻辑(只需替换 ConcreteMediator 实现)
# ai # c++ # ios # stream # red # String # 子类 # const # 字符串 # int # 循环 # 指针 # 继承 # 虚函数 # 纯虚函数 # 接口 # class # public # Event # 对象 # 事件 # this # ui # 多个 # 而非 # 文本框 # 类中 # 聊天室 # 中统 # 这一 # 就能 # 只需
相关文章: 三星网站视频制作教程下载,三星w23网页如何全屏? 网站制作公司排行榜,抖音怎样做个人官方网站 网站制作知乎推荐,想做自己的网站用什么工具比较好? 如何在建站之星绑定自定义域名? 深入理解Android中的xmlns:tools属性 婚礼视频制作网站,学习*后期制作的网站有哪些? 详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一) 家具网站制作软件,家具厂怎么跑业务? 如何快速选择适合个人网站的云服务器配置? 如何有效防御Web建站篡改攻击? 如何通过WDCP绑定主域名及创建子域名站点? 实现虚拟支付需哪些建站技术支撑? 宝塔建站助手安装配置与建站模板使用全流程解析 简易网站制作视频教程,使用记事本编写一个简单的网页html文件? 怀化网站制作公司,怀化新生儿上户网上办理流程? 品牌网站制作公司有哪些,买正品品牌一般去哪个网站买? C++如何使用std::optional?(处理可选值) 电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的? 深圳网站制作案例,网页的相关名词有哪些? 如何正确选择百度移动适配建站域名? 浅析上传头像示例及其注意事项 如何快速搭建虚拟主机网站?新手必看指南 怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平? 如何通过虚拟机搭建网站?详细步骤解析 建站之星如何一键生成手机站? 如何使用Golang安装API文档生成工具_快速生成接口文档 建站三合一如何选?哪家性价比更高? 香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧 如何通过免费商城建站系统源码自定义网站主题与功能? 车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办? 如何在IIS7中新建站点?详细步骤解析 如何快速搭建高效WAP手机网站? 成都网站制作公司哪家好,四川省职工服务网是做什么用? 建站之星安装步骤有哪些常见问题? 网站微信制作软件,如何制作微信链接? 建站VPS推荐:2025年高性能服务器配置指南 智能起名网站制作软件有哪些,制作logo的软件? 上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息? 网站制作的步骤包括,正确网址格式怎么写? seo网站制作优化,网站SEO优化步骤有哪些? ,柠檬视频怎样兑换vip? 如何快速搭建高效可靠的建站解决方案? 建站之星如何保障用户数据免受黑客入侵? 山东网站制作公司有哪些,山东大源集团官网? 如何用y主机助手快速搭建网站? 网站建设设计制作营销公司南阳,如何策划设计和建设网站? 如何通过PHP快速构建高效问答网站功能? 枣阳网站制作,阳新火车站打的到仙岛湖多少钱? 建站之星备案流程有哪些注意事项? 如何通过VPS搭建网站快速盈利?
*请认真填写需求信息,我们会在24小时内与您取得联系。