当前位置: 首页 > news >正文

中介设计模式

中介模式

想象一个场景:有n个人在一起聊天,如果其中一个人发信息了,其它人要收到信息。
那么如何将n个人相互连接一起呢?
最简单的做法就是一个人与其它(n-1)个人保持联系,那么将会有n(n-1)个关系,复杂无比。


那么接下来就是引入中介模式了。
中介模式好比一台交换机,只要所有用户和它连接就可以通过这台交换机来转播信息。那它需要什么方法呢?
首先想到的就是发送信息方法。
其次它怎么知道有哪些用户连接它,所以它还有一个注册用户的方法

// 抽象中介 class Mediator{ public: virtual void registerUser(User* user) = 0; virtual void sendMessage(const std::string& mes,User* sender) = 0; virtual ~Mediator() = default; };

那么再想一下这个virtual void sendMessage(const std::string& mes,User* sender) = 0;这个方法是给客户端用的吗?
很明显第二个参数是User,如果是给客户端调用岂不是要记住所有用户,这是不现实的。
那么可以让用户类去引用这个中介,在用户类中调用中介的sendMessage放法,那么消息的发送者不就是this
所以用户需要暴露一个send方法给客户端使用

// 抽象用户 class User{ protected: Mediator* _mediator; // 持有中介引用 std::string _name; public: User(const std::string& name):_name(name),_mediator(nullptr){} virtual ~User() = default; void setMediator(Mediator* m){ _mediator = m; } virtual void send(const std::string& msg) = 0; virtual void receive(const std::string& msg) = 0; std::string getName()const{ return _name; } };

Code

接下来演示一个聊天室的中介设计模式

class User; // 抽象中介 class Mediator{ public: virtual void registerUser(User* user) = 0; virtual void sendMessage(const std::string& mes,User* sender) = 0; virtual ~Mediator() = default; }; // 抽象同事 class User{ protected: Mediator* _mediator; // 持有中介引用 std::string _name; public: User(const std::string& name):_name(name),_mediator(nullptr){} virtual ~User() = default; void setMediator(Mediator* m){ _mediator = m; } virtual void send(const std::string& msg) = 0; virtual void receive(const std::string& msg) = 0; std::string getName()const{ return _name; } }; // 具体中介 class ChatRoom:public Mediator{ public: void registerUser(User* user) override{ users.push_back(user); user->setMediator(this); // 绑定中介 } void sendMessage(const std::string& msg,User* sender) override{ for(const auto user:users){ if(user!=sender){ user->receive(msg); } } } ~ChatRoom() = default; // 由客户端管理用户内存 private: std::vector<User*> users; }; // 具体同事类 class ChatUser:public User{ public: ChatUser(const std::string& name):User(name){} void send(const std::string& msg) override{ std::cout << "【" << _name << "】发送:" << msg << std::endl; if(_mediator){ _mediator->sendMessage(msg,this); } } void receive(const std::string& msg) override{ std::cout << "【" << _name << "】收到:" << msg << std::endl; } ~ChatUser() = default; }; signed main() { Mediator* chatRoom = new ChatRoom; User* alice = new ChatUser("Alice"); User* bob = new ChatUser("Bob"); User* charlie = new ChatUser("Charlie"); chatRoom->registerUser(alice); chatRoom->registerUser(bob); chatRoom->registerUser(charlie); alice->send("大家好,我是Alice!"); std::cout << "------------------------" << std::endl; bob->send("Hi Alice,欢迎加入聊天室!"); return 0; }
http://www.jsqmd.com/news/794033/

相关文章:

  • 【领域驱动设计 开篇】零 来源及学习路径
  • 视觉语言模型心智理论评估:意图理解与视角采样的能力分离现象
  • IMMACULATE框架:黑盒LLM服务的可验证审计技术
  • EDA技术演进全景:从物理验证到AI驱动的设计自动化
  • 示波器有效位数(ENOB)实战指南:从原理到选型与应用
  • IoT设备无线通信合规测试全解析
  • Oracle诉Google案:API版权与合理使用对软件互操作性的深远影响
  • 从苹果三星2016年困境看消费电子行业创新与供应链管理
  • 树莓派创意相机实战:从图像处理到嵌入式系统集成
  • DevSquad:一体化开发者工具箱,提升本地开发与调试效率
  • 数据库安全与权限管理详解
  • 《Java面试85题图解版(二)》进阶深化下篇:Redis缓存
  • 观察使用Token Plan套餐后月度AI调用成本的变化趋势
  • Java多线程:从入门到进阶
  • 构建产品级AI智能体:五层架构与审美工程实战指南
  • 鸣潮自动化终极指南:5分钟解放双手,告别重复刷图
  • [具身智能-660]:具身智能系统 三层分级架构(基于 ROS2 分布式全域组网):上位机可视化层 + 中位机 AI 决策层 + 下位机实时感知执行层三级分层架构。
  • 从绕接到焊接:硬件连接技术的演进与工程思维启示
  • ARM TPIU调试接口原理与应用实践
  • 面向对象——面向对象基础
  • Docker镜像逆向分析:dfimage工具原理、实战与CI/CD应用
  • 从美光收购尔必达看DRAM产业格局:技术、市场与整合逻辑
  • 抖音下载器终极指南:3种场景下的高效内容获取方案
  • AI智能体规则引擎:从提示词约束到运行时控制的架构实践
  • openclaw官网入口中文版_一键1分钟免费使用小龙虾AI!
  • 手把手教你学Simulink——基于Simulink的储能PCS(功率转换系统)离网V/f控制仿真示例
  • 以太网技术演进:从局域网到万物互联的生态系统
  • SDN与IoT融合:构建云边端一体的智能网络神经系统
  • 【AI大模型春招面试题31】什么是“零样本学习(Zero-Shot)”“少样本学习(Few-Shot)”?大模型实现这类能力的核心原因?
  • 芯片验证覆盖率:从度量陷阱到有效策略的实战解析