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

设计模式C++实现23:中介者模式(Mediator)

部分内容参考大话设计模式第25章;本实验通过C++语言实现。 

一 原理 

意图:用一个中介对象来封装一系列对象的交互,中介者使得各个对象不需要显示地相互引用,从而使耦合松散,而且可以独立地改变它们之间的交互。 

上下文:多个对象互相关联交互,对象之间维持一种复杂的网状引用关系。如果遇到一些需求更改,这种直接的引用关系将面临不断的变化。

如何管理对象间的复杂关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化? 

中介者模式静态类图 

​ 

Mediator:定义一个接口与各个Colleague(同事)通信。

ConcreteMediator:通过协调各个Colleague实现协作行为,了解并维护它的各个Colleague。

Colleague:每个Colleague都知道它的Mediator对象;每个Colleague在需要与其他Colleague通信的时候,都与它的Mediator通信。

 

测试代码 

#include <iostream>
#include <list>
#include <mutex>
#include <inttypes.h>
using namespace std;
class Mediator;class Colleague
{
public:Mediator *mediator;Colleague(Mediator *);virtual void send(string msg) = 0;virtual void notify(string msg) = 0;
};class Mediator
{
public:virtual void send(Colleague *c,string msg) = 0;
};Colleague::Colleague(Mediator *m):mediator(m)
{}class ConcreteColleague1:public Colleague
{
public:ConcreteColleague1(Mediator *m):Colleague(m){}// Colleague interface
public:void send(string msg) override{this->mediator->send(this,msg);}void notify(string msg) override{cout << "同事1得到信息:" << msg << endl;}
};class ConcreteColleague2:public Colleague
{
public:ConcreteColleague2(Mediator *m):Colleague(m){}// Colleague interface
public:void send(string msg) override{this->mediator->send(this,msg);}void notify(string msg) override{cout << "同事2得到信息:" << msg << endl;}
};class ConreteMediator:public Mediator
{
public:Colleague *c1;Colleague *c2;void setC1(Colleague *value);void setC2(Colleague *value);// Mediator interface
public:void send(Colleague *c, string msg){if(c == c1){c2->notify(msg);}else{c1->notify(msg);}}
};
void ConreteMediator::setC2(Colleague *value)
{
c2 = value;
}void ConreteMediator::setC1(Colleague *value)
{c1 = value;
}int main(void)
{ConreteMediator *m = new ConreteMediator();Colleague *c1 = new ConcreteColleague1(m);Colleague *c2 = new ConcreteColleague2(m);m->setC1(c1);m->setC2(c2);c1->send("我是C1");c2->send("我是C2");return 0;
}

测试结果:

同事2得到信息:我是C1

同事1得到信息:我是C2

二 实例

 

抽象后的UML图 

 测试代码:

#include <iostream>
#include <list>
#include <mutex>
#include <inttypes.h>
using namespace std;class guojia;
//机构
class jigou{
public://传话virtual void chuanhua(string msg,guojia *g) = 0;
};
//国家
class guojia{
public:jigou *mediator;guojia(jigou *j):mediator(j){}virtual void read(string msg) = 0;virtual void write(string msg) = 0;};
//美国
class meiguo:public guojia{public:meiguo(jigou *j):guojia(j){}// guojia interface
public:void read(string msg){cout << "==>【美国收到消息】 " << msg << endl;}void write(string msg){cout << "【美国发消息】 " << msg << endl;this->mediator->chuanhua(msg,this);}
};//伊拉克
class yilake:public guojia{
public:yilake(jigou *j):guojia(j){}// guojia interface
public:void read(string msg){cout << "==>【伊拉克收到消息】 " << msg << endl;}void write(string msg){cout << "【伊拉克发消息】 " << msg << endl;this->mediator->chuanhua(msg,this);}
};class anlihui :public jigou{
public:meiguo *g1;yilake *g2;// jigou interface
public:void chuanhua(string msg,guojia *g){if(g == g1){g2->read(msg);}else{g1->read(msg);}}void setG1(meiguo *value);void setG2(yilake *value);
};
void anlihui::setG2(yilake *value)
{
g2 = value;
}void anlihui::setG1(meiguo *value)
{
g1 = value;
}int main(void)
{anlihui *m = new anlihui();meiguo *g1 = new meiguo(m);yilake *g2 = new yilake(m);m->setG1(g1);m->setG2(g2);g1->write("地球是方的,跟我念");g2->write("地球是芳芳的");g1->write("芳芳是谁?");g2->write("没有芳芳");g1->write("交出芳芳,保你荣华富贵");g2->write("真没有芳芳");return 0;}

运行结果: 

【美国发消息】 地球是方的,跟我念

==>【伊拉克收到消息】 地球是方的,跟我念

【伊拉克发消息】 地球是芳芳的

==>【美国收到消息】 地球是芳芳的

【美国发消息】 芳芳是谁?

==>【伊拉克收到消息】 芳芳是谁?

【伊拉克发消息】 没有芳芳

==>【美国收到消息】 没有芳芳

【美国发消息】 交出芳芳,保你荣华富贵

==>【伊拉克收到消息】 交出芳芳,保你荣华富贵

【伊拉克发消息】 真没有芳芳

==>【美国收到消息】 真没有芳芳

小结 

相关文章:

设计模式C++实现23:中介者模式(Mediator)

部分内容参考大话设计模式第25章&#xff1b;本实验通过C语言实现。 一 原理 意图&#xff1a;用一个中介对象来封装一系列对象的交互&#xff0c;中介者使得各个对象不需要显示地相互引用&#xff0c;从而使耦合松散&#xff0c;而且可以独立地改变它们之间的交互。 上下文…...

Java方法【未完待续】

目录 前言 一、什么是方法&#xff1f; 二、方法的定义和调用 方法的定义 方法的调用 三、方法的重载 重载规则 实现理论 总结 前言 随着对Java这一编程语言的深入学习&#xff0c;大家可能会遇到一个熟悉又陌生的词——方法&#xff0c;其实Java方法就是我们学习C/C时…...

(考研湖科大教书匠计算机网络)第六章应用层-第一、二节:应用层概述和C/S及P2P

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;应用层概述二&#xff1a;客户/服务器&#xff08;C/S&#xff09;和对等&#xff08;P2P&#xff09;方式&#xff08;1&#xff09;客户/服务器&…...

禅道bug提醒脚本部署

环境准备 nginxpython3 服务器目录 以下目录为自定义配置&#xff0c;需在 nginx 默认配置文件的http{}内添加 include /www/conf/*.conf; 才会生效 /www ├── conf "存放配置文件 │ └── lowCode.zyl.conf "低代码bug统计页配置 ├── wwwlogs "存…...

利用spring的retry重试编写Feign远程调用重试

自定义注解FeignRetry为了解决上面提到的问题&#xff0c;让Feign调用的每个接口单独配置不同的重试机制。我们使用了面向切面编程并编写了一个自定义注解&#xff1a;FeignRetry。此注释的工作方式类似于Retryable的包装器&#xff0c;并与其共享相同的规范以避免混淆。Target…...

Docker启动RabbitMQ,实现生产者与消费者

目录 一、Docker拉取镜像并启动RabbitMQ 二、Hello World &#xff08;一&#xff09;依赖导入 &#xff08;二&#xff09;消息生产者 &#xff08;三&#xff09;消息消费者 三、实现轮训分发消息 &#xff08;一&#xff09;抽取工具类 &#xff08;二&#xff09;启…...

【C语言】函数栈帧的创建与销毁

Yan-英杰的主页 悟已往之不谏 知来者之可追 目录 ​0.ebp和esp是如何来维护栈帧的呢&#xff1f; 1.为什么局部变量的值不初始化是随机的&#xff1f; ​2.局部变量是怎么创建的&#xff1f; ​3 .函数是如何传参的&#xff1f;传参的顺序是怎样的 4.函数是如何调用的 ​…...

【Git】使用Git上传项目到远程仓库Gitee码云步骤详解

电脑里存放了很多项目&#xff0c;有的备份&#xff0c;有的没备份&#xff0c;如果不仔细分类管理的话&#xff0c;时间一长&#xff0c;到时看到那就会觉得非常杂乱&#xff0c;很难整理&#xff0c;这里有一个叫源代码托管&#xff0c;用过它的都知道&#xff0c;方便管理和…...

Head First设计模式---3.装饰者模式

3.1装饰者模式 亦称&#xff1a; 装饰者模式、装饰器模式、Wrapper、Decorator 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 举个例子&#xff1a;天气很冷&#xff0c;我们一件一件穿衣服&#xff0c…...

Python 算法交易实验48 表字段设计

说明 虽然说的是表&#xff0c;实际上用的是Mongo集合 基于ADBS(APIFunc DataBase Service)可以构造一个供后续研究、生产长时间使用的数据基础&#xff0c;这个基础包括了&#xff1a; 1 队列服务。通过队列&#xff0c;数据可以通过API实现零担和批量两种模式的快速存储。2 …...

库存管理系统-课后程序(JAVA基础案例教程-黑马程序员编著-第六章-课后作业)

【案例6-1】 库存管理系统 【案例介绍】 1.任务描述 像商城和超市这样的地方&#xff0c;都需要有自己的库房&#xff0c;并且库房商品的库存变化有专人记录&#xff0c;这样才能保证商城和超市正常运转。 本例要求编写一个程序&#xff0c;模拟库存管理系统。该系统主要包…...

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒(解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题)

【极海APM32替代笔记】HAL库低功耗STOP停止模式的串口唤醒&#xff08;解决进入以后立马唤醒、串口唤醒和回调无法一起使用、接收数据不全的问题&#xff09; 【STM32笔记】低功耗模式配置及避坑汇总 前文&#xff1a; blog.csdn.net/weixin_53403301/article/details/128216…...

Python类变量和实例变量(类属性和实例属性)

无论是类属性还是类方法&#xff0c;都无法像普通变量或者函数那样&#xff0c;在类的外部直接使用它们。我们可以将类看做一个独立的空间&#xff0c;则类属性其实就是在类体中定义的变量&#xff0c;类方法是在类体中定义的函数。 在类体中&#xff0c;根据变量定义的位置不…...

Glide加载图片

使用Glide加载图片&#xff0c;默认情况下在内存中缓存该图片。这样的情况下如果我们保存头像在某个路径&#xff0c;当再次更换头像时可能由于缓存问题&#xff0c;UI上更新的不及时。 默认加载图片方式&#xff1a; Glide.with(context).load(coverPath).error(R.drawable.a…...

有关时间复杂度和空间复杂度的练习

目录 一、消失的数字 二、轮转数组 三、 单选题 一、消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在 O(n) 时间内完成吗&#xff1f; 注意&#xff1a;本题相对书上原题稍作改动 示例 1&#xff1a; 输入…...

linux服务器nfs数据挂载

参考&#xff1a;https://blog.csdn.net/qq_43721935/article/details/119889841?from_wecom1 1、NFS 介绍 NFS 即网络文件系统&#xff08;Network File-System&#xff09;&#xff0c;可以通过网络让不同机器、不同系统之间可以实现文件共享。通过 NFS&#xff0c;可以访问…...

Python 自动化测试必会技能板块—unittest框架

说到 Python 的单元测试框架&#xff0c;想必接触过 Python 的朋友脑袋里第一个想到的就是 unittest。的确&#xff0c;作为 Python 的标准库&#xff0c;它很优秀&#xff0c;并被广泛应用于各个项目。但其实在 Python 众多项目中&#xff0c;主流的单元测试框架远不止这一个。…...

mysql存储引擎、事务、索引

目录MySQL进阶存储引擎什么是存储引擎常用存储引擎事务什么是事务怎么理解提交事务 和回滚事务事务特性事务的隔离级别索引什么是索引索引的实现原理什么条件下&#xff0c;我们会考虑给字段添加索引呢?什么条件下&#xff0c;索引会失效&#xff1f;索引分类MySQL进阶 存储引…...

毕业论文图片格式、分辨率选择及高质量Word转PDF方法

已知1&#xff1a;毕业论文盲评通常需要提交PDF文件。 已知2&#xff1a;PDF文件太大可能会导致翻页卡顿以及上传盲评网站失败。 已知3&#xff1a;Word转PDF方法不当可能会导致图像模糊。 已知4&#xff1a;打印机分辨率通常为300dpi。 问题1&#xff1a;论文插图分辨率设置…...

华为外包测试2年,不甘被替换,168天的学习转岗成正式员工

我25岁的时候&#xff0c;华为外包测试&#xff0c;薪资13.5k&#xff0c;人在深圳。 内卷什么的就不说了&#xff0c;而且人在外包那些高级精英年薪大几十的咱也接触不到&#xff0c;就说说外包吧。假设以我为界限&#xff0c;25岁一线城市13.5k&#xff0c;那22-24大部分情况…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...

python读取SQLite表个并生成pdf文件

代码用于创建含50列的SQLite数据库并插入500行随机浮点数据&#xff0c;随后读取数据&#xff0c;通过ReportLab生成横向PDF表格&#xff0c;包含格式化&#xff08;两位小数&#xff09;及表头、网格线等美观样式。 # 导入所需库 import sqlite3 # 用于操作…...

Ubuntu 可执行程序自启动方法

使用 autostart&#xff08;适用于桌面环境&#xff09; 适用于 GNOME/KDE 桌面环境&#xff08;如 Ubuntu 图形界面&#xff09; 1. 创建 .desktop 文件 sudo vi ~/.config/autostart/my_laser.desktop[Desktop Entry] TypeApplication NameMy Laser Program Execbash -c &…...

uni-app学习笔记二十三--交互反馈showToast用法

showToast部分文档位于uniapp官网-->API-->界面&#xff1a;uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容&#xff0c;长度与 icon 取值有关。iconString否图…...

Q1起重机指挥理论备考要点分析

Q1起重机指挥理论备考要点分析 一、考试重点内容概述 Q1起重机指挥理论考试主要包含三大核心模块&#xff1a;安全技术知识&#xff08;占40%&#xff09;、指挥信号规范&#xff08;占30%&#xff09;和法规标准&#xff08;占30%&#xff09;。考试采用百分制&#xff0c;8…...

SpringBoot离线应用的5种实现方式

在当今高度依赖网络的环境中&#xff0c;离线应用的价值日益凸显。无论是在网络不稳定的区域运行的现场系统&#xff0c;还是需要在断网环境下使用的企业内部应用&#xff0c;具备离线工作能力已成为许多应用的必备特性。 本文将介绍基于SpringBoot实现离线应用的5种不同方式。…...