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

中介者模式(Mediator Pattern)

定义

中介者模式(Mediator Pattern)是一种行为设计模式,它用于将一组对象的交互行为封装在一个中介者对象中,从而减少对象之间的直接耦合。这种模式提供了一种集中式的控制方式,通过中介者对象来协调不同对象之间的交互。

示例

以下是一个简单的 C++ 中介者模式的示例,我们以聊天室为例,其中用户(User)之间的消息传递通过中介者(ChatRoom)进行协调。

#include <iostream>
#include <string>
#include <vector>class User;// 中介者接口
class ChatRoom {
public:virtual void sendMessage(const std::string& message, User* user) = 0;
};// 具体中介者类
class ConcreteChatRoom : public ChatRoom {
public:void sendMessage(const std::string& message, User* user) override {// 将消息广播给其他用户for (User* u : users) {if (u != user) {u->receiveMessage(message);}}}void addUser(User* user) {users.push_back(user);}private:std::vector<User*> users;
};// 抽象同事类
class User {
public:User(const std::string& name, ChatRoom* chatRoom) : name(name), chatRoom(chatRoom) {chatRoom->addUser(this);}virtual void sendMessage(const std::string& message) {chatRoom->sendMessage(name + ": " + message, this);}virtual void receiveMessage(const std::string& message) {std::cout << name << " received: " << message << std::endl;}private:std::string name;ChatRoom* chatRoom;
};// 具体同事类
class ConcreteUser : public User {
public:ConcreteUser(const std::string& name, ChatRoom* chatRoom) : User(name, chatRoom) {}// 具体用户的其他操作...
};int main() {ConcreteChatRoom chatRoom;ConcreteUser user1("Alice", &chatRoom);ConcreteUser user2("Bob", &chatRoom);ConcreteUser user3("Charlie", &chatRoom);user1.sendMessage("Hello, everyone!");return 0;
}

解释:

  1. 中介者接口和具体中介者类: ChatRoom 是中介者的接口,ConcreteChatRoom 是实现该接口的具体中介者类。中介者负责协调用户之间的通信。

  2. 抽象同事类和具体同事类: User 是抽象同事类,ConcreteUser 是实现该抽象类的具体同事类。每个用户通过中介者发送消息,并接收其他用户的消息。

  3. 用户和中介者的交互: 用户通过中介者发送消息,中介者负责将消息传递给其他用户。这样,用户之间不直接通信,而是通过中介者进行协调,降低了对象之间的耦合性。

  4. 示例运行: 在示例中,Alice 发送消息后,Bob 和 Charlie 都能收到消息,而不需要直接知道消息的发送者是谁。这就是中介者模式的作用。

中介者模式可以在需要解耦多个对象之间的交互关系时发挥作用,使得系统更加灵活可

相关文章:

  • Adobe Acrobat DC中如何合并pdf并生成目录
  • 云时代【4】—— 资源隔离与控制技术
  • 原码,反码,补码
  • 嵌入式烧录报错:板端IP与PC的IP相同
  • STM32控制max30102读取血氧心率数据(keil5工程)
  • js实现文件下载,并传给后端
  • Linux 软链接与硬链接
  • 【MySQL】_自连接与子查询
  • 小项目——学校宿舍楼系统
  • Nest.js权限管理系统开发(二)连接MySQL、Redis
  • Uniapp在IOS系统打包测试流程
  • leetcode 重复的子字符串
  • android开发电子书,android基础编程
  • 服务器数据恢复-服务器RAID5上层XFS文件系统分区数据恢复案例
  • 【vue+element ui】大屏自适应中el-select下拉内容在低分辨率下显示不全问题解决
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [nginx文档翻译系列] 控制nginx
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android Studio:GIT提交项目到远程仓库
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Apache Pulsar 2.1 重磅发布
  • C++入门教程(10):for 语句
  • express如何解决request entity too large问题
  • Hexo+码云+git快速搭建免费的静态Blog
  • JAVA之继承和多态
  • Redux系列x:源码分析
  • Swift 中的尾递归和蹦床
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 前端js -- this指向总结。
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 通过几道题目学习二叉搜索树
  • 微信公众号开发小记——5.python微信红包
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 自制字幕遮挡器
  • #pragma预处理命令
  • #QT(智能家居界面-界面切换)
  • (02)vite环境变量配置
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (十)T检验-第一部分
  • (十三)Flask之特殊装饰器详解
  • (推荐)叮当——中文语音对话机器人
  • (轉)JSON.stringify 语法实例讲解
  • .Family_物联网
  • .Net Memory Profiler的使用举例
  • .NET 事件模型教程(二)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?