中介者模式的核心目标是解耦相互依赖的同事对象,使其通过中介者协调交互而非直接通信。它包含抽象中介者、具体中介者和抽象同事类三个角色,通过封装交互逻辑提升可维护性与扩展性。
中介者模式(Mediator Pattern)在 C++ 中的核心目标是**解耦一组相互依赖的对象(同事类)**,让它们不再直接通信,而是通过一个“中介者”对象协调交互。这样修改某个同事逻辑时,不影响其他同事,提升可维护性和扩展性。
要实现中介者模式,需明确定义以下三部分:
notify、send),通常为纯虚类。假设两个用户(UserA 和 UserB)通过聊天室(ChatRoom)发送消息——这是典型的中介者场景:
// 抽象中介者
class Mediator {
public:
virtual void notify(const std::string& sender, const std::string& msg) = 0;
virtual ~Mediator() = default;
};
// 抽象同事类
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;
virtual ~Colleague() = default;
};
// 具体中介者:聊天室
class ChatRoom : public Mediator {
private:
Colleague usera = nullptr;
Colleague userb = nullptr;
public:
void setUserA(Colleague a) { usera = a; }
void setUserB(Colleague b) { userb = b; }
void notify(const std::string& sender, const std::string& msg) override {
if (sender == "UserA" && user_b_) {
user_b_->receive("[UserA] " + msg);
} else if (sender == "UserB" && user_a_) {
user_a_->receive("[UserB] " + msg);
}
}};
// 具体同事:用户
class User : public Colleague {
private:
std::string name_;
public:
User(const std::string& name, Mediator* m) : Colleague(m), name_(name) {}
void send(const std::string& msg) override {
mediator_->notify(name_, msg);
}
void receive(const std::string& msg) override {
std::cout << name_ << " received: " << msg << std::endl;
}};
使用方式:
int main() {
ChatRoom room;
User user_a("UserA", &room);
User user_b("UserB", &room);
room.setUserA(&user_a);
room.setUserB(&user_b);
user_a.send("Hello!");
user_b.send("Hi there!");
return 0;}
关键细节与实用建议
class Mediator;,实现文件中再 include 具体中介者头文件。std::shared_ptr 或 std::weak_ptr 避免悬空指针(尤其当中介者持有同事指针时)。notify 可接收枚举类型事件码 + 数据结构(如 struct Event { EventType type; std::any data; }),比字符串更安全高效。中介者强调一对多的协调控制流(A 发消息 → 中介者决定发给 B 还是 C 或都发),而观察者是一对多的通知
广播(主题变化 → 所有观察者被动响应)。中介者知道所有同事,观察者彼此完全匿名。两者解决的问题不同:一个是“怎么协同”,一个是“怎么通知”。
基本上就这些。中介者模式不复杂但容易忽略——真正价值不在代码量,而在把隐式依赖变成显式契约,让模块边界清晰起来。
# ai
# c++
# red
# String
# 封装
# include
# 枚举类型
# const
# 字符串
# 循环
# 指针
# 数据结构
# 接口
# class
# public
# private
# Struct
# 委托
# Event
# 空指针
# 对象
# 事件
# ui
# 聊天室
# 这是
# 头文件
# 相互依赖
# 而在
# 使其
# 而非
# 谁在
# 不直接
相关文章:
如何在云主机快速搭建网站站点?
中山网站制作网页,中山新生登记系统登记流程?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
网站视频怎么制作,哪个网站可以免费收看好莱坞经典大片?
合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何选择网络建站服务器?高效建站必看指南
建站之星伪静态规则如何正确配置?
北京制作网站的公司,北京铁路集团官方网站?
如何在IIS7上新建站点并设置安全权限?
建站主机选哪家性价比最高?
如何用免费手机建站系统零基础打造专业网站?
如何在云虚拟主机上快速搭建个人网站?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
如何在搬瓦工VPS快速搭建网站?
制作国外网站的软件,国外有哪些比较优质的网站推荐?
如何选择美橙互联多站合一建站方案?
学校为何禁止电信移动建设网站?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
如何通过万网虚拟主机快速搭建网站?
怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?
洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?
html制作网站的步骤有哪些,iapp如何添加网页?
如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法
如何确认建站备案号应放置的具体位置?
天津个人网站制作公司,天津网约车驾驶员从业资格证官网?
盘锦网站制作公司,盘锦大洼有多少5G网站?
定制建站流程步骤详解:一站式方案设计与开发指南
如何在阿里云高效完成企业建站全流程?
高端建站三要素:定制模板、企业官网与响应式设计优化
零服务器AI建站解决方案:快速部署与云端平台低成本实践
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何在IIS服务器上快速部署高效网站?
制作宣传网站的软件,小红书可以宣传网站吗?
C#如何在一个XML文件中查找并替换文本内容
php json中文编码为null的解决办法
建站主机功能解析:服务器选择与快速搭建指南
如何快速查询网址的建站时间与历史轨迹?
详解jQuery停止动画——stop()方法的使用
如何通过VPS建站实现广告与增值服务盈利?
网站制作话术技巧,网站推广做的好怎么话术?
代购小票制作网站有哪些,购物小票的简要说明?
怀化网站制作公司,怀化新生儿上户网上办理流程?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
,如何利用word制作宣传手册?
如何在橙子建站上传落地页?操作指南详解
官网自助建站平台指南:在线制作、快速建站与模板选择全解析
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星如何实现PC+手机+微信网站五合一建站?
*请认真填写需求信息,我们会在24小时内与您取得联系。