小谈设计模式(26)—中介者模式
小谈设计模式(26)—中介者模式
- 专栏介绍
- 专栏地址
- 专栏介绍
- 中介者模式
- 分析
- 角色分析
- 抽象中介者(Mediator)
- 具体中介者(ConcreteMediator)
- 抽象同事类(Colleague)
- 具体同事类(ConcreteColleague)
- 工作过程
- 优缺点分析
- 优点分析
- 1
- 2
- 缺点分析
- 1
- 2
- 适用场景
- 1
- 2
- Java程序分析
- 分析
- 1
- 2
- 3
- 输出结果
- 总结
专栏介绍
专栏地址
http://t.csdnimg.cn/VpriY
专栏介绍
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。

中介者模式
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过将对象之间的通信封装到一个中介者对象中,从而实现对象之间的松耦合。中介者模式可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。
分析
在中介者模式中,存在一个中介者对象,它封装了对象之间的通信逻辑。对象之间的通信不再直接发生,而是通过中介者对象进行。当一个对象需要与其他对象进行通信时,它不需要知道其他对象的具体细节,只需要与中介者进行交互即可。

角色分析
抽象中介者(Mediator)
定义了中介者对象的接口,它通常包含一个或多个抽象的通信方法,用于定义对象之间的通信规则。
具体中介者(ConcreteMediator)
实现了抽象中介者的接口,它通过协调各个同事对象来实现协作行为。
抽象同事类(Colleague)
定义了同事对象的接口,它通常包含一个中介者对象的引用,用于与中介者进行通信。
具体同事类(ConcreteColleague)
实现了抽象同事类的接口,它与其他同事对象通过中介者进行通信。

工作过程
各个同事对象将自己的引用传递给中介者对象,以便中介者对象能够与各个同事对象进行通信。
当一个同事对象需要与其他同事对象进行通信时,它将请求发送给中介者对象。
中介者对象接收到请求后,根据通信规则进行相应的处理,并将请求转发给目标同事对象。
目标同事对象接收到请求后,进行相应的处理。

优缺点分析
优点分析
1
减少了对象之间的直接依赖,提高了系统的灵活性和可维护性。
2
将对象之间的通信集中到一个中介者对象中,使得系统结构更加清晰。
缺点分析
1
中介者对象将承担较多的责任,可能会变得复杂。
2
如果中介者对象存在过多的逻辑,可能会影响系统的性能。

适用场景
1
当对象之间存在复杂的通信逻辑时,可以使用中介者模式将通信逻辑集中到一个中介者对象中。
2
当对象之间的通信关系呈现网状结构时,可以使用中介者模式将通信关系简化为星型结构。

Java程序分析
// 抽象中介者
interface Mediator {void sendMessage(String message, Colleague colleague);
}// 具体中介者
class ConcreteMediator implements Mediator {private Colleague colleague1;private Colleague colleague2;public void setColleague1(Colleague colleague1) {this.colleague1 = colleague1;}public void setColleague2(Colleague colleague2) {this.colleague2 = colleague2;}@Overridepublic void sendMessage(String message, Colleague colleague) {if (colleague == colleague1) {colleague2.receiveMessage(message);} else if (colleague == colleague2) {colleague1.receiveMessage(message);}}
}// 抽象同事类
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void sendMessage(String message);public abstract void receiveMessage(String message);
}// 具体同事类
class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message) {System.out.println("ConcreteColleague1 received message: " + message);}
}// 具体同事类
class ConcreteColleague2 extends Colleague {public ConcreteColleague2(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message) {System.out.println("ConcreteColleague2 received message: " + message);}
}// 测试类
public class MediatorPatternExample {public static void main(String[] args) {ConcreteMediator mediator = new ConcreteMediator();ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);mediator.setColleague1(colleague1);mediator.setColleague2(colleague2);colleague1.sendMessage("Hello from colleague1");colleague2.sendMessage("Hi from colleague2");}
}
分析
1
在上述示例中,Mediator是抽象中介者接口,定义了中介者对象的通信方法。ConcreteMediator是具体中介者类,实现了抽象中介者接口,并通过协调各个同事对象来实现协作行为。
2
Colleague是抽象同事类,定义了同事对象的接口,并包含一个中介者对象的引用,用于与中介者进行通信。ConcreteColleague1和ConcreteColleague2是具体同事类,分别实现了抽象同事类的接口。
3
在测试类MediatorPatternExample中,创建了具体中介者对象和具体同事对象,并将同事对象的引用传递给中介者对象。然后,通过同事对象调用sendMessage方法发送消息,中介者对象根据通信规则进行处理,并将消息转发给目标同事对象。最后,目标同事对象接收到消息并进行处理。
输出结果
ConcreteColleague2 received message: Hello from colleague1
ConcreteColleague1 received message: Hi from colleague2
以上示例演示了中介者模式的基本实现,通过中介者对象实现了对象之间的松耦合,实现了对象之间的通信。
总结
总结起来,中介者模式通过将对象之间的通信封装到一个中介者对象中,实现了对象之间的松耦合。它可以减少对象之间的直接依赖,提高系统的灵活性和可维护性。中介者模式适用于对象之间存在复杂的通信逻辑或通信关系呈现网状结构的场景。
相关文章:
小谈设计模式(26)—中介者模式
小谈设计模式(26)—中介者模式 专栏介绍专栏地址专栏介绍 中介者模式分析角色分析抽象中介者(Mediator)具体中介者(ConcreteMediator)抽象同事类(Colleague)具体同事类(C…...
7种设计模式
1. 工厂模式 优点:封装了对象的创建过程,降低了耦合性,提供了灵活性和可扩展性。 缺点:增加了代码的复杂性,需要创建工厂类。 适用场景:当需要根据不同条件创建不同对象时,或者需要隐藏对象创建…...
el-table合计行合并
效果如下 因为合计el-table的合并方法是不生效的,所以需要修改css下手 watch: {// 应急物资的合计合并planData: {immediate: true,handler() {setTimeout(() > {const tds document.querySelectorAll(".pro_table .el-table__footer-wrapper tr>td");tds[0]…...
新手如何快速上手HTTP爬虫IP?
对于刚接触HTTP爬虫IP的新手来说,可能会感到有些困惑。但是,实际上HTTP爬虫IP并不复杂,只要掌握了基本的操作步骤,就可以轻松使用。本文将为新手们提供一个快速上手HTTP爬虫IP的入门指南,帮助您迅速了解HTTP爬虫IP的基…...
(十五)VBA常用基础知识:正则表达式的使用
vba正则表达式的说明 项目说明Pattern在这里写正则表达式,例:[\d]{2,4}IgnoreCase大小写区分,默认false:区分;true:不区分Globaltrue:全体检索;false:最小匹配Test类似p…...
vue配置@路径
第一步:安装path,如果node_module文件夹中有path就不用安装了 安装命令:npm install path --save 第二步:在vue.config.js文件(如果没有就新建)中配置 const path require("path"); function …...
Ubuntu 18.04 OpenCV3.4.5 + OpenCV3.4.5 Contrib 编译
目录 1 依赖安装 2 下载opencv3.4.5及opencv3.4.5 contrib版本 3 编译opencv3.4.5 opencv3.4.5_contrib及遇到的问题 1 依赖安装 首先安装编译工具CMake,命令安装即可: sudo apt install cmake 安装Eigen: sudo apt-get install libeigen3-…...
【网络基础】IP 子网划分(VLSM)
目录 一、 为什么要划分子网 二、如何划分子网 1、划分两个子网 2、划分多个子网 一、 为什么要划分子网 假设有一个B类IP地址172.16.0.0,B类IP的默认子网掩码是 255.255.0.0,那么该网段内IP的变化范围为 172.16.0.0 ~ 172.16.255.255,即…...
【OCR】合同上批量贴印章
一、需求 OCR算法在处理合同等文件时,会由于印章等遮挡导致文本误识别。因此在OCR预处理时,有一个很重要的步骤是“去除印章”。其中本文主要聚焦在“去除印章”任务中的数据构建步骤:“合同伪印章”的数据构建。下面直接放几张批量合成后效果…...
Stable diffusion 用DeOldify给黑白照片、视频上色
老照片常常因为当时的技术限制而只有黑白版本。然而现代的 AI 技术,如 DeOldify,可以让这些照片重现色彩。 本教程将详细介绍如何使用 DeOldify 来给老照片上色。. 之前介绍过基于虚拟环境的 基于DeOldify的给黑白照片、视频上色,本次介绍对于新手比较友好的在Stable diff…...
在服务器上解压.7z文件
1. 更新apt sudo apt-get update2. 安装p7zip sudo apt-get install p7zip-full3. 解压.7z文件 7za x WN18RR.7z...
【opencv】windows10下opencv4.8.0-cuda C++版本源码编译教程
【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程前言准备工具cuda/cudnncmakeopencv4.8.0opencv_contrib CMake编译VS2019编…...
软碟通制作启动盘
一、下载并安装软碟通 二、插入U盘,打开软碟通; 三、在软碟通中选择“文件”-“打开镜像文件”,选择要制作成启动盘的ISO镜像文件; 1.打开要制作的iso文件 选择对应的iso文件 四、在软碟通中选择“启动”-“写入硬盘”ÿ…...
Tomcat和HPPT协议
1.介绍 1.Java EE 规范 JavaEE(java Enterprise Edition):java企业版 JavaEE 规范是很多的java开发技术的总称。这些技术规范都是沿用自J2EE的。一共包括了13个技术规范 2.WEB概述 WEB在计算机领域中代表的是网络 像我们之前所用的WWW&…...
Acwing.4736步行者(模拟)
题目 约翰参加了一场步行比赛。 比赛为期 N 天,参赛者共 M 人(包括约翰)。 参赛者编号为 1∼M,其中约翰的编号为 P。 每个参赛者的每日步数都将被赛事方记录并公布。 每日步数最多的参赛者是当日的日冠军(可以有并…...
前端预览、下载二进制文件流(png、pdf)
前端请求设置 responseType: “blob” 后台接口返回的文件流如下: 拿到后端返回的文件流后: 预览 <iframe :src"previewUrl" frameborder"0" style"width: 500px; height: 500px;"></iframe>1、预览 v…...
搞定ESD(三):ESD干扰耦合路径深入分析(一)
文章目录 一、外部测试环境引发的电场耦合1.1 静电枪枪体的电场耦合1.2 垂直耦合板与水平耦合板的电场耦合二、静电电流泄放路径中的电场耦合2.1 金属平面与敏感信号之间的电场耦合2.2 参考平面与敏感信号布线之间的电场耦合2.3 芯片散热片电场耦合分析2.3.1 散热片静电耦合机理…...
广州华锐互动:炼钢工厂VR仿真实训系统
随着科技的发展,我们的教育体系和职业培训方法也在迅速变化。其中,虚拟现实(VR)技术的出现为我们提供了一种全新的学习和培训方式。特别是在需要高度专业技能和安全性的领域,如钢铁冶炼。本文将探讨如何使用VR进行钢铁…...
适用于音视频的弱网测试整理
一、什么是弱网环境 对于弱网的定义,不同的应用对弱网的定义是有一定的差别的,不仅要考虑各类型网络最低速率,还要结合业务场景和应用类型去划分。按照移动的特性来说,一般应用低于2G速率的都属于弱网,也可以将3G划分…...
【Spring MVC研究】DispatcherServlet如何处理请求(doDispatcher方法)
文章目录 1. 最经典的MVC的使用情况2. 经典情况相关的组件3. 执行3.1. 先看DispatcherServlet的总体过程3.2. 再看RequestMappingHandlerAdapter的总体过程3.2.1. RequestParamMethodArgumentResolver3.2.2. 反射调用 Controller 的方法3.2.3. RequestResponseBodyMethodProces…...
[iPhone USB网络共享]完全指南:从驱动故障到高效连接
[iPhone USB网络共享]完全指南:从驱动故障到高效连接 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com/gh_mirr…...
DP数组的容量要不要+1?
其实,dp 数组要不要 1,完全取决于 “DP数组”下标代表什么 。 简单来说,只有两种情况。我们结合“凑钱”题和经典的“爬楼梯”题来对比一下。📏 情况一:下标代表“金额/重量/容量”(需要 1) 场景…...
如何让Apple Touch Bar在Windows完美运行?DFRDisplayKm驱动全攻略
如何让Apple Touch Bar在Windows完美运行?DFRDisplayKm驱动全攻略 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm Apple Touch Bar作为MacBook Pro的特…...
fre:ac开源音频转换工具:让无损音乐在全设备自由流动的专业级解决方案
fre:ac开源音频转换工具:让无损音乐在全设备自由流动的专业级解决方案 【免费下载链接】freac The fre:ac audio converter project 项目地址: https://gitcode.com/gh_mirrors/fr/freac 你是否遇到过这些音乐管理难题:珍藏多年的CD专辑不知如何数…...
跨平台部署YOLOv5的路径陷阱:从WindowsPath错误看Python pathlib的兼容性设计
1. 当WindowsPath遇上Linux:YOLOv5部署的路径陷阱 最近帮朋友调试一个YOLOv5模型部署问题,场景特别典型:在Windows训练好的目标检测模型,迁移到Linux服务器就报错。错误信息直指一个看似简单的路径问题:"NotImple…...
终极指南:如何在NixOS上完美打包与使用SilentSDDM主题
终极指南:如何在NixOS上完美打包与使用SilentSDDM主题 【免费下载链接】SilentSDDM A very customizable SDDM theme that actually looks good. 项目地址: https://gitcode.com/gh_mirrors/si/SilentSDDM SilentSDDM是一款高度可定制且视觉精美的SDDM登录主…...
终极指南:NanoVG渲染管线深度解析与抗锯齿技术实战
终极指南:NanoVG渲染管线深度解析与抗锯齿技术实战 【免费下载链接】nanovg Antialiased 2D vector drawing library on top of OpenGL for UI and visualizations. 项目地址: https://gitcode.com/gh_mirrors/na/nanovg NanoVG是一款基于OpenGL的轻量级抗锯…...
别再手动查ID了!用R包一键搞定单细胞Marker基因ID转换(附org.Hs.eg.db实战)
单细胞Marker基因ID转换实战:用org.Hs.eg.db实现高效精准映射 刚完成单细胞聚类分析的研究者,常常会面临一个看似简单却极其耗时的任务——将Marker基因的Symbol标识转换为标准的Entrez ID。这个步骤虽然基础,却直接影响后续GO富集分析的可靠…...
2026年全国优质网站建设公司权威甄选榜,推荐十家公司官网搭建与设计制作服务商能力评估正式发布
据Gartner、QuestMobile联合发布的2026年企业数字化服务报告显示,国内网站建设行业市场规模突破1870亿元,同比增长19.3%;上海作为长三角数字经济核心枢纽,企业官网新建与升级需求同比提升27.8%,其中高端定制建站需求增…...
万象视界灵坛惊艳效果展示:同一张宠物图在‘金毛犬’‘幼犬’‘户外玩耍’‘毛发蓬松’多维排序
万象视界灵坛惊艳效果展示:同一张宠物图在"金毛犬""幼犬""户外玩耍""毛发蓬松"多维排序 1. 效果展示开场 今天我要向大家展示万象视界灵坛这个神奇工具的实际效果。它就像一个视觉魔法师,能够深入理解图片中的…...
