中介者模式【行为模式C++】

news2025/3/1 1:10:35

1.简介

中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的直接交互, 迫使它们通过一个中介者对象进行合作。

亦称: 调解人、控制器、Intermediary、Controller、Mediator

2.示例

中介者模式在 C++ 代码中最常用于帮助程序 GUI 组件之间的通信。 在 MVC 模式中, 控制器是中介者的同义词

假如你有一个创建和修改客户资料的对话框, 它由各种控件组成, 例如文本框 (Text­Field)、 复选框 (Checkbox) 和按钮 (Button) 等。

某些表单元素可能会直接进行互动。 例如, 选中 一个复选框后可能会显示一个隐藏文本框用于输入信息。 另一个例子是提交按钮必须在保存数据前校验所有输入内容

 

如果直接在表单元素代码中实现业务逻辑, 你将很难在程序其他表单中复用这些元素类。 例如, 由于复选框类与输入的文本框相耦合, 所以将无法在其他表单中使用它。

中介者模式建议你停止组件之间的直接交流并使其相互独立。 这些组件必须调用特殊的中介者对象, 通过中介者对象重定向调用行为, 以间接的方式进行合作。 最终, 组件仅依赖于一个中介者类, 无需与多个其他组件相耦合。

之前当用户点击按钮后, 它必须对所有表单元素数值进行校验。 使用中介者模式现在它的唯一工作是将点击事件通知给对话框。 收到通知后, 对话框可以自行校验数值或将任务委派给各元素。 这样一来, 按钮不再与多个表单元素相关联, 而仅依赖于对话框类

本例中用户触发的元素不会直接与其他元素交流, 即使看上去它们应该这样做。 相反, 元素只需让中介者知晓事件即可,中介者是整个认证对话框。 对话框知道具体元素应如何进行合作并促进它们的间接交流。 当接收到事件通知后, 对话框会确定负责处理事件的元素并据此重定向请求。

3.结构

3.1 实现方式

其结构包括以下几个要素:

  • 抽象中介者(Mediator):定义统一的接口,用于各个同事角色之间的通信。
  • 具体中介者(ConcreteMediator):维持对各个同事对象的引用,从具体的同事对象接收消息,向具体同事对象发出命令,通过协调各个同事对象来实现协作行为。
  • 抽象同事(Colleague):定义各个同事类公有的方法,并声明了一些抽象方法来供子类实现,同时维持了一个对抽象中介者类的引用,其子类可以通过该引用来与中介者通信。
  • 具体同事(具ConcreteColleague):实现了在抽象同事类中声明的抽象方法,每一个同事对象在需要和其他同事对象通信时先与中介者通信,通过中介者来间接完成与其他同事类的通信。
#include <cstdio>


//中介者接口
class Mediator {
public:
	virtual void broadcast(const char* message) = 0;
};

//同事接口
class Colleague {
private:
	Mediator *mediator;
public:
	Colleague(Mediator *mediator) {
		this->mediator = mediator;
	}
	void send(const char* message) {
		mediator->broadcast(message);
	}
	virtual void receive(const char* message) = 0;
};

//具体中介者
class ConcreteMediator : public Mediator {
private:
	Colleague *colleagues[10];
	int count;
public:
	ConcreteMediator() {
		count = 0;
	}
	void addColleague(Colleague *colleague) {
		colleagues[count++] = colleague;
	}
	void broadcast(const char* message) {
		for (int i = 0; i < count; i++)
			colleagues[i]->receive(message);
	}
};

//具体同事
class ConcreteColleague : public Colleague {
private:
	const char *name;
public:
	ConcreteColleague(const char *name, Mediator *mediator) : Colleague(mediator) {
		this->name = name;
	}
	void receive(const char* message) {
		printf("%s receive %s\n", name, message);
	}
};

int main() {
	ConcreteMediator mediator;
	ConcreteColleague colleague1("colleague1", &mediator);
	ConcreteColleague colleague2("colleague2", &mediator);
	mediator.addColleague(&colleague1);
	colleague1.send("HELLO");
	mediator.addColleague(&colleague2);
	colleague1.send("HI");
	return 0;
}
3.2 执行结果

4.中介者优缺点

优点:

  • 减少对象之间的耦合度,使其变得简单易维护。
  • 提高代码的重用性和可扩展性,增强了系统的灵活性和可维护性。
  • 降低了类的复杂度,将一对多转化成了一对一。

缺点:

  • 中介者对象通常具有较高的复杂性,难以实现。
  • 当对象之间的交互较少或简单时,中介者模式可能会增加系统的一些不必要的复杂性。
  • 随着系统的扩大,中介者模式的复杂度可能会增加,使得代码难以维护。

5 使用场景

  • 当一些对象和其他对象紧密耦合以致难以对其进行修改时, 可使用中介者模式。
  • 当组件因过于依赖其他组件而无法在不同应用中复用时, 可使用中介者模式。
  • 如果为了能在不同情景下复用一些基本行为, 导致你需要被迫创建大量组件子类时, 可使用中介者模式。

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

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

相关文章

【氧化镓】β-Ga2O3肖特基势垒二极管的缺陷识别

本文是一篇关于β-Ga2O3肖特基势垒二极管在电子辐射和退火调节下缺陷识别的研究。文章首先介绍了β-Ga2O3作为一种高性能器件材料的重要性&#xff0c;然后详细描述了实验方法&#xff0c;包括样品制备、电子辐照、热退火处理以及电学特性和深能级瞬态谱&#xff08;DLTS&#…

深度学习环境搭建问题汇总

pip无法通过国内源下载&#xff0c;could not find a version that satisfies the requirement 当遇见could not find a version that satisfies the requirement问题时&#xff0c;可以通过下载whl的方式进行离线安装&#xff0c;以torch1.12.0为例&#xff0c;如果用的是阿里…

一网统管/安防监控/视频综合管理EasyCVR视频汇聚平台解决方案

一、当前现状分析 当前视频资源面临以下问题&#xff1a; 1&#xff09;不同单位在视频平台建设中以所属领域为单位&#xff0c;设备品牌众多&#xff0c;存在的标准不一&#xff0c;各系统之间也没有统一标准&#xff1b; 2&#xff09;各单位视频平台建设分散、统筹性差&a…

机器学习和深度学习 -- 李宏毅(笔记与个人理解1-6)

机器学习和深度学习教程 – 李宏毅&#xff08;笔记与个人理解&#xff09; day1 课程内容 什么是机器学习 找函数关键技术&#xff08;深度学习&#xff09; 函数 – 类神经网络来表示 &#xff1b;输入输出可以是 向量或者矩阵等如何找到函数&#xff1a; supervised Lear…

Redis 最佳实践 [后端必看]

文章目录 1. Redis 键值设计1.1 优雅的 key 结构1.2 拒绝 BigKeyBigKey的危害如何发现BigKey①redis-cli --bigkeys② scan 扫描③第三方监控④网络监控 如何删除 BigKey 1.3 恰当的数据类型总结&#xff1a; 2. 批处理优化3. 服务器端优化-持久化配置4. 服务器端优化-慢查询优…

产品经理有门槛吗?

转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…

移植 amd blas 到 cuda 生态

1&#xff0c;下载源码 GitHub - ROCm/rocBLAS: Next generation BLAS implementation for ROCm platform $ git clone --recursive https://github.com/ROCm/rocBLAS.git 2&#xff0c; 编译 2.1 不带Tensile的编译 如果是在conda环境中&#xff0c;需要deactive conda 环境…

线上商城做活动,页面氛围布置不能少

一个商城系统要做营销&#xff0c;该从哪些方面入手营造商城活动氛围&#xff0c;对于线上商城系统来说&#xff0c;除了营销的价格氛围&#xff0c;另一个重要的氛围就是视觉氛围&#xff0c;能让人第一眼注意到&#xff0c;并产生兴趣&#xff0c;这就迈出了营销的关键一步。…

《springcloud alibaba》 五 gateway网关

目录 gateway基础版本pom.xmlapplication.yml启动类测试 gateway集成nacosorder-nacos和stock-nacos项目微调cloud-gateway调整测试 gateway集成nacos简写版本内置断言自定义断言工厂规范 全局过滤器gateway流控降级pom.xmlapplication.yml测试流控具体配置api流控 降级代码版本…

数字社交的新典范:解析Facebook的成功密码

在当今数字化时代&#xff0c;社交媒体已经成为人们日常生活的重要组成部分&#xff0c;而Facebook作为最知名的社交媒体平台之一&#xff0c;其成功之处备受瞩目。本文将深入解析Facebook的成功密码&#xff0c;探讨其在数字社交领域的新典范。 1. 用户体验的优化 Facebook注…

Dude, where’s that IP? Circumventing measurement-based IP geolocation(2010年)

下载地址:https://www.usenix.org/legacy/event/sec10/tech/full_papers/Gill.pdf 被引次数:102 Gill P, Ganjali Y, Wong B. Dude, Wheres That {IP}? Circumventing Measurement-based {IP} Geolocation[C]//19th USENIX Security Symposium (USENIX Security 10). 2010.…

UE_导入内容_Maya静态网格体导出为FBX的常规设置

注意事项&#xff1a;单位设置统一为cm&#xff1b;轴朝向&#xff0c;Maya默认y轴朝上&#xff0c;UE4 z轴向上&#xff1b;变换枢轴&#xff0c;UE4会将导入模型前世界中心作为枢轴中心&#xff0c;要旋转就需要注意了&#xff1b;法线&#xff0c;UE4内材质默认单面显示&…

ubuntu 更改 ssh 默认端口

出于加固安全考虑&#xff0c;一般公司会禁用 ssh 的 22 端口号&#xff0c;因此我们需要改为其他端口。 1、ssh 命令行登录 进入台式机&#xff0c;修改 /etc/ssh/sshd_config 文件中的 Port 配置行&#xff0c;将 22 改为 8022&#xff0c;保存修改后&#xff0c;重启 ssh 服…

MySQL 主从 AUTO_INCREMENT 不一致问题分析

作者&#xff1a;vivo 互联网数据库团队 - Wei Haodong 本文介绍了 MySQL5.7 中常见的replace into 操作造成的主从auto_increment不一致现象&#xff0c;一旦触发了主从切换&#xff0c;业务的正常插入操作会触发主键冲突的报错提示。 一、问题描述 1.1 问题现象 在 MySQL …

如何选择一款好用的电子名片,作为全员营销工具,又提升企业品牌形象!

移动互联网发展渐趋成熟的今天&#xff0c;企业的营销方式已经发生的很大的转变&#xff0c;传统的营销方式已经无法适应数字化时代的营销节奏&#xff0c;使用数字化营销工具能够帮助企业实现快速传播&#xff0c;精准定位你客户群体。同时&#xff0c;通过对营销数据的分析&a…

2024最新最简单的安卓底部菜单栏教程

2024最新最简单的安卓底部菜单栏教程 大界面跳转 public class MainActivity extends AppCompatActivity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);BottomNavigationView b…

SQLite Android 绑定(十八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 在Android安装与定制方案&#xff08;十七&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 ​ 应用程序编程 加载共享库 在使用任何与 SQLite 相关的方法或对象之前&#xff0c;本机 SQLite 必…

数字货币:金融创新的未来?

随着科技的进步&#xff0c;数字货币作为一种新型的金融工具正逐渐走进人们的视线。那么&#xff0c;数字货币究竟是什么&#xff1f;它有哪些优势&#xff1f;它是否真的能够引领金融创新的未来&#xff1f;本文将从专业角度出发&#xff0c;深入探讨这些问题。 一、数字货币的…

MySQL高级(索引分类-聚集索引-二级索引)

目录 1、主键索引、唯一索引、常规索引、全文索引 2、 聚集索引、二级索引 3、回表查询 4、通过id查询和通过name查询那个执行效率高&#xff1f; 5、 InnoDB主键索引的 B tree 高度为多高呢&#xff1f; 1、主键索引、唯一索引、常规索引、全文索引 在MySQL数据库&#xff0c…

在vite中限制node版本

1.修改package.json文件 {"name": "wine-store-frontend","version": "0.0.0","private": true,"type": "module","scripts": {"dev": "vite --open","build"…