【c++设计模式之中介者模式】分析及示例

中介者模式属于行为型设计模式,旨在减少对象之间的耦合关系,通过引入一个中介者对象,将对象间复杂的交互转化为中介者与对象之间的简单交互,中介者模式实现了集中式控制,有助于系统的维护和扩展。

以下是一个使用中介者模式的示例,假设有多个同事对象(Colleague),这些同事对象以不同方式交互,为了解耦合,引入一个中介者对象(Mediator),该中介者对象负责协调所有同事对象之间的交互,如下所示:

在上图中,Colleague类是抽象同事类,具体同事类ConcreteColleague1和ConcreteColleague2继承自该类。Mediator是抽象中介者类,具体中介者类ConcreteMediator继承自该类并实现中介者的具体逻辑。

具体代码实现如下:

//抽象同事类
class Colleague
{
public:Colleague(Mediator* mediator) : m_mediator(mediator) {}virtual void sendMsg(std::string msg) = 0;virtual void receiveMsg(std::string msg) = 0;
protected:Mediator* m_mediator;
};//具体同事类1
class ConcreteColleague1 : public Colleague
{
public:ConcreteColleague1(Mediator* mediator) : Colleague(mediator) {}void sendMsg(std::string msg) override{m_mediator->sendMsg(msg, this);}void receiveMsg(std::string msg) override{std::cout << "ConcreteColleague1 received msg: " << msg << std::endl;}
};//具体同事类2
class ConcreteColleague2 : public Colleague
{
public:ConcreteColleague2(Mediator* mediator) : Colleague(mediator) {}void sendMsg(std::string msg) override{m_mediator->sendMsg(msg, this);}void receiveMsg(std::string msg) override{std::cout << "ConcreteColleague2 received msg: " << msg << std::endl;}
};//抽象中介者类
class Mediator
{
public:virtual void sendMsg(std::string msg, Colleague* sender) = 0;
};//具体中介者类
class ConcreteMediator : public Mediator
{
public:ConcreteMediator() {}void sendMsg(std::string msg, Colleague* sender) override{auto iter = m_colleagues.find(sender);if (iter != m_colleagues.end()){for (auto it = m_colleagues.begin(); it != m_colleagues.end(); ++it){if (it->first != iter->first){it->second->receiveMsg(msg);}}}}void addColleague(Colleague* colleague){m_colleagues[colleague] = colleague;}
private:std::map<Colleague*, Colleague*> m_colleagues;
};int main()
{ConcreteMediator mediator;ConcreteColleague1 colleague1(&mediator);ConcreteColleague2 colleague2(&mediator);mediator.addColleague(&colleague1);mediator.addColleague(&colleague2);colleague1.sendMsg("Hello, this is ConcreteColleague1.");colleague2.sendMsg("Hi, this is ConcreteColleague2.");return 0;
}

在上述代码中,Colleague类是抽象同事类,ConcreteColleague1和ConcreteColleague2是具体同事类,它们都继承自Colleague类,并实现了虚函数sendMsg和receiveMsg。Mediator是抽象中介者类,ConcreteMediator是具体中介者类,它们都继承自Mediator类,并实现了虚函数sendMsg。

在main函数中,创建了具体中介者ConcreteMediator对象以及两个具体同事ConcreteColleague1和ConcreteColleague2对象,并将它们加入ConcreteMediator对象的同事列表中。接着分别调用ConcreteColleague1对象和ConcreteColleague2对象的sendMsg函数,向ConcreteMediator对象发送消息,最终得到正确的输出结果。

总之,中介者模式通过引入中介者对象,将对象间复杂的交互转化为中介者与对象之间的简单交互,从而减少了对象之间的耦合关系。在实际应用中,开发人员可以根据实际需要灵活使用中介者模式,以获得更好的系统拓展性和可维护性。

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

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

相关文章

秋招校招,什么是群面?

时间已经来到十月份&#xff0c;我们也迎来了秋季招聘的高峰期。一般来说&#xff0c;企业为了提高面试的速度&#xff0c;一般都会让我们进行群面。可是&#xff0c;很多人不懂得“群面”的意思&#xff0c;由此导致自己在面试环节丢分。今天&#xff0c;就跟着小编一起来了解…

【C++ techniques】虚化构造函数、虚化非成员函数

constructor的虚化 virtual function&#xff1a;完成“因类型而异”的行为&#xff1b;constructor&#xff1a;明确类型时构造函数&#xff1b;virtual constructor&#xff1a;视其获得的输入&#xff0c;可产生不同的类型对象。 //假如写一个软件&#xff0c;用来处理时事…

Spring Webflux DispatcherHandler源码整理

DispatcherHandler的构造(以RequestMappingHandlerMapping为例) WebFluxAutoConfiguration中EnableWebFluxConfiguration继承WebFluxConfigurationSupportBean public DispatcherHandler webHandler() {return new DispatcherHandler(); }DispatcherHandler#setApplicationCon…

移除元素(简单)

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个数组nums和一个值val&#xff0c;你需要"原地"移除所有数值等于val的元素&#xff0c;并返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须仅使用O(1)额外空间并"原地"修改输入数组。元…

【微服务的集成测试】python实现-附ChatGPT解析

1.题目 微服务的集成测试 知识点:深搜 时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 现在有n个容器服务,服务的启动可能有一定的依赖性 (有些服务启动没有依赖)其次服务自身启动加载会消耗一些时间。 给你一个 nxn 的二维矩阵 useTime,其中 useTime[i][i]=10 表示…

阿里云关系型数据库有哪些?RDS云数据库汇总

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …

QT实现TCP服务器客户端的实现

ser&#xff1a; widget.cpp&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);// 此时&#xf…

嵌入式软件架构中抽象层设计方法

大家好&#xff0c;今天分享一篇嵌入式软件架构设计相关的文章。 软件架构这东西&#xff0c;众说纷纭&#xff0c;各有观点。什么是软件架构&#xff0c;我们能在网上找到无数种定义。 比如&#xff0c;我们可以这样定义&#xff1a;软件架构是软件系统的基本结构&#xff0c…

g(x)=abx形式的函数最小二乘法计算方法

设函数&#xff0c;利用最小二乘法求解系数a和b: 设&#xff0c;&#xff0c;有 用最小二乘法求解和后&#xff0c;可得和&#xff1a; &#xff0c;

【网络安全---ICMP报文分析】Wireshark教程----Wireshark 分析ICMP报文数据试验

一&#xff0c;试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机&#xff08;虚拟机&#xff09; kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置&#xff1a; 编辑-------- 虚拟网路编辑器 更改设置进来以后 &#xff0c;先选择N…

用pyinstaller打包LGBM模型为ELF/EXE可执行文件

1. 引入 写好的python代码和模型&#xff0c;如果需要做到离线部署、运行&#xff0c;就必须要将代码和模型打包为可独立运行的可执行文件。 使用pyinstaller就能做到这个&#xff0c;相同的代码&#xff0c;在windows上运行就能打包为exe&#xff0c;在linux上运行就能打包为…

android studio导入android源码模块开发总结

一、aidegen自动生成并导入android模块 1.源码下载后&#xff0c;键入 . build/envsetup.sh lunch sdk_car_x86_64-userdebug 以上命令执行后&#xff0c;tools/asuite/aidegen的源码会被编译为aidegen可执行文件 2.使用aidegen生成并自动导入模块 aidegen Settings -i j -…

AJAX和JSON

1、AJAX&#xff1a; AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建交互式、动态网页的技术。它允许网页在不重新加载整个页面的情况下与服务器进行异步通信&#xff0c;从而改善用户体验。以下是关于AJAX的一些重要信息&#xff1a; 异步通信&a…

银行业务队列简单模拟(队列应用)

设某银行有A、B两个业务窗口&#xff0c;且处理业务的速度不一样&#xff0c;其中A窗口处理速度是B窗口的2倍 —— 即当A窗口每处理完2个顾客时&#xff0c;B窗口处理完1个顾客。给定到达银行的顾客序列&#xff0c;请按业务完成的顺序输出顾客序列。假定不考虑顾客先后到达的时…

虚拟货币(也称为加密货币或数字货币)的运作

虚拟币发展史 虚拟币的发展史可以追溯到20世纪末和21世纪初&#xff0c;以下是虚拟币的重要发展节点&#xff1a; 1998年&#xff1a;比特币白皮书的发布 比特币的概念最早由中本聪&#xff08;Satoshi Nakamoto&#xff09;在1998年提出&#xff0c;随后在2008年发布了一份名…

(Note)机器学习面试题

机器学习 1.两位同事从上海出发前往深圳出差&#xff0c;他们在不同时间出发&#xff0c;搭乘的交通工具也不同&#xff0c;能准确描述两者“上海到深圳”距离差别的是&#xff1a; A.欧式距离 B.余弦距离 C.曼哈顿距离 D.切比雪夫距离 S:D 1. 欧几里得距离 计算公式&#x…

JavaScript事件之拖拽事件(详解)

在网页开发的过程中我们经常会接触到拖拽事件&#xff0c;虽然每个网页和每个网页的拖拽的效果大相径庭&#xff0c;但是从根本来讲&#xff0c;代码是几乎一模一样的。   简而言之&#xff0c;拖拽效果就是鼠标按下&#xff0c;被拖拽的元素随着鼠标而移动&#xff0c;鼠标松…

【单片机】13-实时时钟DS1302

1.RTC的简介 1.什么是实时时钟&#xff08;RTC&#xff09; &#xff08;rtc for real time clock) &#xff08;1&#xff09;时间点和时间段的概念区分 &#xff08;2&#xff09;单片机为什么需要时间点【一定的时间点干什么事情】 &#xff08;3&#xff09;RTC如何存在于…

Trie字符串统计(c++题解)

维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N 个操作&#xff0c;所有输入的字符串总长度不超过 105&#xff0c;字符串仅包含小写英文字母。 输入格式 第一行包含整…

Mydb数据库问题

1、请简要介绍一下这个基于 Java 的简易数据库管理系统。它的主要功能是什么&#xff1f; TM&#xff08;Transaction Manager&#xff09;&#xff1a;事务管理器&#xff0c;用于维护事务的状态&#xff0c;并提供接口供其他模块查询某个事务的状态。DM&#xff08;Data Man…