中介者模式详解

devtools/2024/10/25 20:29:21/

中介者模式

简介通过引入一个中介者对象来封装和协调多个对象之间的交互,从而降低对象间的耦合度。
人话:就是两个类或者系统之间, 不要直接互相调用, 而是要中间的类来专门进行交互。
举个例子
比如两个国家之间(关系差, 没有大使馆), 需要联合国作为中介进行对话.

class Country;class UnitedNations
{
public:vector<Country*> _countries;void add_contry(Country* c);void send(string s);
};class Country
{
private:UnitedNations* un;
public:Country(UnitedNations* u) : un(u) {};UnitedNations* get_un() { return un; };virtual void speek(string s) = 0;virtual void listen(string s) = 0;
};void UnitedNations::add_contry(Country* c)
{_countries.push_back(c);
}void UnitedNations::send(string s)
{for (Country* c : _countries)c->listen(s);
}class China : public Country
{
public:China(UnitedNations* un) : Country(un) {};void speek(string s) override{cout << "China said : " << s << endl;get_un()->send(s);}void listen(string s)override{cout << "----China get : " << s << endl;}
};class America : public Country
{
public:America(UnitedNations* un) : Country(un) {};void speek(string s) override{cout << "America said : " << s << endl;get_un()->send(s);}void listen(string s)override{cout << "----America get : " << s << endl;}
};class Russia : public Country
{
public:Russia(UnitedNations* un) : Country(un) {};void speek(string s) override{cout << "Russia said : " << s << endl;get_un()->send(s);}void listen(string s)override{cout << "----Russia get : " << s << endl;}
};int main()
{UnitedNations* un = new UnitedNations();China* c = new China(un);America* a = new America(un);Russia* r = new Russia(un);un->add_contry(c);un->add_contry(a);un->add_contry(r);r->speek("美国, 你爹来了");a->speek("呵呵, 笑死");c->speek("大家文明讲话");return 0;
}

执行结果
在这里插入图片描述


http://www.ppmy.cn/devtools/100570.html

相关文章

在IDEA中使用Git

在IntelliJ IDEA&#xff08;通常简称为IDEA&#xff09;中使用Git进行版本控制是一种高效且集成度高的做法。以下是在IDEA中使用 Git的详细步骤和说明&#xff1a;一、安装与配置Git 安装Git&#xff1a; 前往Git的官方网站下载并安装Git。 安装过程中&#xff0c;建议勾选“…

九、前端中的异步方法Promise,Promise详解

文章目录 1.Promise简介什么是promise为什么使用Promisepromise中的状态 2.Promis的用法 1.Promise简介 什么是promise Promise是异步编程的一种解决方案&#xff0c;它的构造函数是同步执行的&#xff0c;then 方法是异步执行的。 为什么使用Promise 在JavaScript的世界中…

使用python基于fastapi发布接口(三)-操作数据库使用SQLAlchemy

首先需要安装SQLAlchemy pip install sqlalchemy 这里使用的是mysql,所以需要安装pymysql pip install pymysql 创建项目 创建文件夹 sql_fastapi_demo新建__init__.py文件# __init__.py#这只是一个空文件,但它告诉 Python 所在文件夹 是一个包。创建database.pyfrom sqlalch…

模拟实现STL中的unordered_map和unordered_set

目录 1.unordered_map和unordered_set简介 2.unordered_map和unordered_set设计图 3.迭代器的设计 4.哈希表的设计 5.my_unordered_map和my_unordered_set代码 1.unordered_map和unordered_set简介 unordered_map和unordered_set的使用非常类似于map和set&#xff0c;两…

PHPShort轻量级网址缩短程序源码开心版,内含汉化包

需要网址缩短并且想获得更多有关链接点击率和流量的数据分析&#xff0c;那么 PHPShort 可能是一个非常好的选择。PHPShort 是一款高级的 URL 缩短器平台&#xff0c;可以帮助你轻松地缩短链接&#xff0c;并根据受众群体的位置或平台来定位受众。 该程序基于 Laravel 框架编写…

【C++】13.特殊类的设计

一、请设计一个类&#xff0c;不能被拷贝 拷贝只会放生在两个场景中&#xff1a;拷贝构造函数以及赋值运算符重载&#xff0c;因此想要让一个类禁止拷贝&#xff0c;只需让该类不能调用拷贝构造函数以及赋值运算符重载即可 C98 将拷贝构造函数与赋值运算符重载只声明不定义&a…

单线程,多线程,异步,同步详解

关于异步与多线程&#xff0c;笔者在刚接触的时候一直存在诸多疑惑&#xff0c;甚至一度以为这俩概念是用来描述同一种技术在不同场景下的应用&#xff0c;进而导致对很多与它们相关的概念都一知半解&#xff0c;代码中的async/await关键词也是莫名其妙地在用。 但是在不断地接…

docker升级docker pull mysql:5.7.37异常

一、使用背景 我们在使用docker拉取mysql命令时&#xff0c;数据库服务器&#xff0c;网络未开通外网&#xff0c;拉取镜像失败 但是我们还是想用docker部署则可以通过以下方式获取 前提&#xff1a;环境网络通可以pull mysql镜像 [rootVM-20-10-centos opt]# docker ps CO…