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

news2024/11/29 14:52:15

部分内容参考大话设计模式第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;

}





运行结果: 

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

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

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

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

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

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

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

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

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

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

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

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

小结 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/363835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OCR项目实战(一):手写汉语拼音识别(Pytorch版)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; 大数据专业硕士在读&#xff0c;CSDN人工智能领域博客专家&#xff0c;阿里云专家博主&#xff0c;专注大数据与人工智能知识分享。 &#x1f389;专栏推荐&#xff1a; 目前在写一个CV方向专栏&#xff0c;后期会更新不限于…

git merge和git rebase命令

参考链接&#xff1a;https://www.cnblogs.com/michael-xiang/p/13179837.html 学习背景&#xff1a;已经学习过git&#xff0c;但是实践较少&#xff0c;未和他人协作 1.merge git merge表示把当前分支合并到版本库中下拉的远程分支上。 git merge A B表示把A分支合并到B上…

DACS: Domain Adaptation via Cross-domain Mixed Sampling 学习笔记

DACS介绍方法Naive MixingDACSClassMix![在这里插入图片描述](https://img-blog.csdnimg.cn/ca4f83a2711e49f3b754ca90d774cd50.png)算法流程实验结果反思介绍 近年来&#xff0c;基于卷积神经网络的语义分割模型在众多应用中表现出了显著的性能。然而当应用于新的领域时&…

2250216-92-1,Propargyl-PEG3-triethoxysilane,炔基-三聚乙二醇-三乙氧基硅烷,具有高效稳定和特异性

【中文名称】炔基-三聚乙二醇-三乙氧基硅烷【英文名称】 Propargyl-PEG3-triethoxysilane【结 构 式】【CAS号】2250216-92-1【分子式】C19H37NO7Si【分子量】419.59【基团部分】炔基基团【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g&#xff0c;可以提供核磁图…

Zebec生态持续深度布局,ZBC通证月内翻倍或只是开始

“Zebec生态近日利好不断&#xff0c;除了推出了回购计划外&#xff0c;Nautilus Chain、Zebec Labs等也即将面向市场&#xff0c;都将为ZBC通证深度赋能。而ZBC通证涨幅月内突破100%&#xff0c;或许只是开始。”近日&#xff0c;流支付生态Zebec生态通证ZBC迎来了大涨&#x…

计算机网络的166个核心概念,你知道吗?

上回我整理了一下计算机网络中所有的关键概念&#xff0c;很多小伙伴觉得很有帮助&#xff0c;但是有一个需要优化的点就是这些概念不知道出自哪里&#xff0c;所以理解起来像是在云里穿梭&#xff0c;一会儿在聊应用层的概念&#xff0c;一会儿又跑到网络层协议了。针对这种情…

小学生学Arduino---------点阵(二)动态图片以及文字

今天进阶了利用人眼视觉暂留原理制作动态的图片变换。 1、熟练掌握图片显示器的使用 2、创作多种动态图片、文字的显示 3、明确动态图片、文字显示过程 4、掌握图片显示器中清空指令的使用 5、搭建动态图片、文字的显示电路 6、编写动态图片、文字的程序 复习&#xff1a; 绘…

@Slf4j注解的使用

1.Slf4j的作用&#xff1f; 很简单的就是为了能够少写两行代码&#xff0c;不用每次都在类的最前边写上&#xff1a; private static final Logger logger LoggerFactory.getLogger(this.XXX.class); 我们只需要在类前面添加注解Slf4j&#xff0c;即可使用log日志的功能了 2.…

美格智能与宏电股份签署战略合作协议,共创5G+AIoT行业先锋

2月17日&#xff0c;美格智能技术股份有限公司CEO杜国彬及相关业务负责人员一行到访深圳市宏电技术股份有限公司总部大厦参观交流&#xff0c;并参加了主题为“聚势同行、合创未来”宏电股份与美格智能2023年IoT产业生态合作研讨会&#xff0c;受到了宏电股份总裁张振宇及相关业…

手写Promise方法(直击Promise A+规范)

前言&#xff1a;大家好&#xff0c;我是前端獭子。高效优雅是我的创作方式。学习是一个渐进的过程&#xff0c;要把知识串联起来才能解决某一方面的问题。 Promise 构造函数 我们先来写 Promise 构造函数的属性和值&#xff0c;以及处理new Promise()时会传入的两个回调函数。…

【Git】IDEA集合Git和码云

目录 7、IDEA集合Git 7.1 配置Git忽略文件-IDEA特定文件 7.2 定位 Git 程序 7.3 初始化本地库 7.4 添加到暂存区 7.5 提交到本地库 7.6 切换版本 7.7 创建分支 7.8 切换分支 7.9 合并分支 7.10 解决冲突 8、 Idea集成码云 8.1 IDEA 安装码云插件 8.2 分析工程到码…

QHashIterator-官翻

QHashIterator Class template <typename Key, typename T> class QHashIterator QHashIterator 类为 QHash 和 QMultiHash 提供 Java 风格的常量迭代器。更多内容… 头文件:#include qmake:QT core 所有成员列表&#xff0c;包括继承的成员废弃的成员 公共成员函数…

硫酸锂溶液除钙镁树脂系统

H-93锂盐净化除钙镁镁螯合树脂是包含氨甲膦酸基连接到聚苯乙烯共聚物的一种耐用的大孔树脂。 CH-93是用于锂盐净化除钙镁从含有一价阳离子的废水处理中选择性的除去二价金属阳离子。使二价金属阳离子以及由其他二价阳离子可以像钙一样容易地从一价阳离子中分离出来。 CH-93是…

[论文阅读笔记19]SiamMOT: Siamese Multi-Object Tracking

这是CVPR2021的一篇文章, 是利用SOT的一些思想来进行MOT的运动估计. 文章地址: 文章 代码地址: 代码 0. 摘要 本文提出了一个孪生(Siamese)式的MOT网络, 该网络用来估计帧间目标的运动. 为了探究运动估计对多目标跟踪的影响, 本文提出了两种运动建模方式: 显式和隐式. 本文在…

C++(41)-低版本升级到VS2019项目时遇到的问题(2)

1.错误码&#xff1a;MSB8066 代码为3 QT 项目老版本升级到新版本造成的&#xff0c; 1.重新加载项目&#xff1a; 扩展->QT VS tools->Open QT project files-> 2.添加QT模块&#xff1a;QT Project-Settings -> QT Modules2.无法打开QT的头文件 3.…

电脑自带的录屏放在哪里了?轻松弄懂,看这篇文章就明白了

有很多小伙伴有这个疑问&#xff0c;电脑自带的录屏放在哪里了&#xff1f;其实&#xff0c;电脑自带的录屏工具并不是所有电脑都要&#xff0c;具体要看你的电脑品牌和操作系统&#xff0c;Windows系统和Mac系统的电脑都自带了录屏工具&#xff0c;下面跟着小编一起来看看吧。…

Redis:缓存一致性问题(缓存更新策略)

Redis缓存的一致性1. 缓存1.1 缓存的作用&#xff1a;1.2 缓存的成本&#xff1a;2. 缓存模型3. 缓存一致性问题3.1 引入3.2 解决(1) 先更新数据库&#xff0c;再手动删除缓存(2) 使用事务保证原子性(3) 以Redis中的TTL为兜底3.3 案例&#xff1a;商铺信息查询和更新(1) 查询商…

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法与讨论

我国二氧化碳地质封存技术起步较晚&#xff0c;目前仍没有一套相对完整的行业规范&#xff1b;且就该技术而言&#xff0c;涉及环节众多&#xff0c;理论相对复杂&#xff0c;对于行业的新入局者不太友好。因此&#xff0c;结合时代背景&#xff0c;我们首次尝试对二氧化碳地质…

【面试1v1实景模拟】Spring事务 一文到底

老面👴:小伙子,了解Spring的事务吗? 解读🔔:这个必须了解,不了解直接挂~😂😂😂,但面试官肯定不是想听你了解两个字,他是想让你简单的介绍下。 笑小枫🍁:了解,事务在逻辑上是一组操作,要么执行,要不都不执行。主要是针对数据库而言的,比如说 MySQL。为…

C++——C++11第三篇

目录 包装器 function包装器 bind 包装器 function包装器 function包装器 也叫作适配器。C中的function本质是一个类模板&#xff0c;也是一个包装器。 上面的程序验证&#xff0c;我们会发现useF函数模板实例化了三份。 包装器可以很好的解决上面的问题 &#xff0c;让它只实…