C++设计模式_17_Mediator 中介者

news2024/12/23 10:23:05

Mediator 中介者也是属于“接口隔离”模式。

文章目录

  • 1. 动机 (Motivation)
  • 2. 模式定义
  • 3. 结构(Structure)
  • 4. 要点总结
  • 5. 其他参考

1. 动机 (Motivation)

  • 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。

举例说明:比如大家经常需要考虑界面,界面上的控件,通常大家希望更改界面中的控件的时候,对应背后会有数据的data model,改界面的时候希望对应的data model也会更改,反过来,data model更改的时候,界面也跟着更改,这两种情况有时候就会导致双向的依赖关系或者直接的依赖关系。这种情况当然不合适,需求的变化就会换一个界面元素,成本就很高。中介者模式提供了一种思路来管理对象间的关联关系,避免相互交互的 对象之间的紧耦合。

  • 在这种情况下,我们可使用一个“中介对象”来管理对象间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。

2. 模式定义

用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖运行时依赖),从而使其耦合松散 (管理变化),而且可以独立地改变它们之间的交互。
—《设计模式》GoF

最经典的依赖倒置原则,A本来依赖B,转换为A依赖IB,B依赖IA,难道A从此和B没关系了吗?不是的,你会发现运行时A和B还产生依赖关系,只不过依赖关系从编译时转换到了运行时。

3. 结构(Structure)

GoF的定义相当粗糙,很容易产生误导,不便于理解。Mediator定义了一个中介者,Colleague内部有一个指针指向了Mediator,ConcreteMediator里面又有指针指向了具体的ConcreteColleague,所以这里面最核心的关系是ConcreteColleague之间没有依赖关系(本来是直接依赖),他们都去依赖Mediator,反过来Mediator内部要依赖Colleague。所以Mediator和Colleague之间是双向依赖的关系,但ConcreteColleague之间没有依赖关系。
通过这种方式达到了依赖的解耦,下图的本质只是描述了依赖解耦,并没有描述其他的东西,甚至在现实中,ConcreteColleague并不是继承自Colleague。
在这里插入图片描述
上图是《设计模式》GoF中定义的Mediator 中介者的设计结构。结合上面的代码看图中最重要的是看其中稳定和变化部分,也就是下图中红框和蓝框框选的部分。
在这里插入图片描述
我们来画一幅图,来梳理上图中的关系,更能帮助大家在现实中掌握和运用该模式。

1、2、3、4、5号对象如果在不加约束的情况下去实现它们之间的访问关系,很有可能是1需要访问3…,他们之间的依赖呈现出下图中的关系。
在这里插入图片描述
希望提出一个新的对象来解耦他们之间的依赖关系,1、2、3、4、5号都是刚才提到的ConcreteColleague,创建一个M来表示Mediator,用1、2、3、4、5号分别跟中介者Mediator之间产生双向的依赖关系。当需要1调用3的时候,不要直接的1去调用3,而是1去通知M,M再去通知3,这个过程中就要牵扯到这个调用通知要定义一个消息规范,你发给M,M怎么知道消息规范是去找3呢 ? 这个是GoF中所没有定义怎么实现,这就相当灵活。举例来说,很多系统里面有数据绑定的模块,界面元素和数据模型之间不希望产生直接依赖,常常提出数据绑定类型,就是这里讲到的M,数据绑定类型会同时依赖两边,有些数据绑定模块会加观察者模式的元素在里面,这样就实现了数据模型只有一变更,不需要做任何主动动作,绑定的对象就得到触发消息,触发消息就会直接去找界面元素去更改,常见的数据绑定对象里就会定义一套数据绑定的一些协议,这些协议就会转化为对象互相通知的协议,对象的ID,对象的具体的属性,属性值,控件属性,需要传递的相关参数,作为协议定义清楚,这是GoF中不会触及的细节,这些细节在实际中又是繁琐的。宗旨是上图转换为下图,直接依赖关系转换为间接依赖关系。
在这里插入图片描述
Mediator 中介者模式相对于Facade门面模式是异曲同工,都是提出新的东西实现隔离,Facade门面模式是系统外于系统内之间的隔离,而Mediator 中介者模式解决的是系统内各个对象之间的依赖。Mediator 中介者模式一定是出现了大量的系统内多个对象复杂的关联关系,可以说Mediator 中介者模式是依赖倒置原则在多个对象场景中的扩展形式。

4. 要点总结

  • 将多个对象间复杂的关联关系解耦,Mediator模式将多个对象间的控制逻辑进行集中管理,变“多个对象互相关联”为“多个对象和一个中介者关联”,简化了系统的维护,抵御了可能的变化。

  • 随着控制逻辑的复杂化,Mediator具体对象的实现可能相当复杂。这时候可以对Mediator对象进行分解处理

  • Facade模式是解耦系统间 (单向) 的对象关联关系;Mediator模式是解耦系统内各个对象之间 (双向)的关联关系。

5. 其他参考

C++设计模式——中介者模式

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

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

相关文章

【python】pip的使用

切换默认源 pip config set global.index-url 源地址 查看切换源是否成功:pip config list 常用镜像源 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple/阿里云:https://mirrors.aliyun.com/pypi/simple/豆瓣:https://pypi…

入学生活科研随笔

近而立之年,巅峰享受的时期有两段。一是高考后,收到入学通知书。早晨,八点多,我醒来在院子里看到,爸爸在门口和邮政快递员寒暄。那天应该是8月15号,清晨凉凉爽爽的,杨树遮住了大半个院子。第二段…

matlab中filter帮助文档中“对矩阵行进行滤波”的解释

1、创建向量 % 创建一个由随机输入数据组成的 215 矩阵。 rng("default") %固定随机数种子 x randi(5,2,6) 结果 x 5 1 4 2 5 1 5 5 1 3 5 5 2、定义有理传递函数的分子和分母系数。 b 1; a [1 -0.2]; 3、沿着…

MATLAB R2018b详细安装教程(附资源)

云盘链接: pan.baidu.com/s/1SsfNtlG96umfXdhaEOPT1g 提取码:1024 大小:11.77GB 安装环境:Win10/Win8/Win7 安装步骤: 1.鼠标右击【R2018b(64bit)】压缩包选择【解压到 R2018b(64bit)】 2.打开解压后的文件夹中的…

【开源】基于SpringBoot的天然气工程运维系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司(施工单位)功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

【APUE】并发 — 信号

目录 一、异步与同步 二、信号的概念 三、signal 函数 3.1 函数原型 3.2 代码示例 四、信号的不可靠 五、可重入函数 反例1:函数内使用了静态数据 反例2:函数内使用了 malloc 或 free 反例3:函数内调用了标准 I/O 函数 六、标准…

基于鸡群算法的无人机航迹规划-附代码

基于鸡群算法的无人机航迹规划 文章目录 基于鸡群算法的无人机航迹规划1.鸡群搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用鸡群算法来优化无人机航迹规划。 1.鸡群搜索算法 …

Docker Harbor概述及构建

Docker Harbor概述及构建 一、Docker Harbor 概述1.1、harbor 简介1.2、Harbor的优势1.3、Harbor 的核心组件1.4、Docker私有仓库 架构 二、Harbor构建Docker私有仓库2.1 环境配置2.2、部署Harbor服务2.2.1、上传dock-compose,并设置权限2.2.2、安装harbor-offline-…

C语言每日一题(21)删除排序数组中的重复项

力扣 26.删除排序数组中的重复项 题目描述 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考…

springboot打包后运行失败

运行jar包,报错如下: 环境描述 win11, springboot项目,jdk1.8,IDEA2022.1.3, spring-boot-maven-plugin版本2.2.6.RELEASE。 idea能正常运行,也能正常打成jar包。但运行jar包出错,报错信息如上。 问题来…

七层负载均衡 HAproxy

一、HAproxy 1、负载均衡类型: (1) 无负载均衡: 没有负载均衡,用户直接连接到 Web 服务器。当许多用户同时访问服务器时,可能无法连接。 (2) 四层负载均衡: 用户访问负载均衡器,负载均衡器将用户的请求…

时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测

时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测 目录 时序预测 | Python实现ARIMA-LSTM差分自回归移动模型结合长短期记忆神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Python实现ARIMA-LSTM差…

关于数据中台的理解和思考

一、什么是数据中台 数据中台是指通过数据技术,对海量数据进行采集、计算、存储、加工,同时统一标准和口径。把数据统一后,会形成标准数据,再进行存储,形成大数据资产层,进而为客户提供高效的、可复用的服…

项目管理软件排行榜聚焦榜:选择最适合你的工具

在一个复杂的项目中,需要有一个好的项目管理软件来帮助协调资源、任务和时间表。然而,市场上有很多种不同的项目管理软件,每种软件都有其优点和缺点。本文综合 PCMag,Softwareworld,B2BSaaS Reviews 等产品测评网站的评…

windows下-mysql环境配置,以及使用navicat可视化数据库,便捷撰写sql语句。

文章目录 MySQL 连接到本地MySQL 下载MySQL连接基本SQL操作语句创建并查看数据库删除数据库修改数据库插入、删除、修改数据 图形化界面展示数据库 Navicat 基础操作连接本地的mysql数据库撰写sql语句 MySQL 连接到本地 MySQL 下载 直接系统自带应用商城下载,安装最…

【多线程面试题 一】、 创建线程有哪几种方式?

文章底部有个人公众号:热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享? 踩过的坑没必要让别人在再踩,自己复盘也能加深记忆。利己利人、所谓双赢。 面试官:创建线程有哪几种方式&a…

Vuex模块化(modules)与namespaced(命名空间)的搭配

Vuex模块化(modules)与namespaced(命名空间)的搭配 Vuex模块化(modules)格式 原理:可以对Vuex的actions,mutations,state,getters四个属性综合成一个部分&a…

Android问题笔记四十一:JNI NewStringUTF错误的几种解决方案

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

B站视频下载工具的分享

直接解压使用1.5.9版本的就可以。 资源:链接:https://pan.baidu.com/s/1zWJWzxVss4h2lmMhCFFzDg?pwdw1v8 提取码:w1v8 先解压 解压 双击使用

小白的福利教学。4+共病+WGCNA+机器学习+实验,简单易复现

今天给同学们分享一篇共病WGCNA机器学习实验的生信文章“Exploring immune related gene signatures and mechanisms linking non alcoholic fatty liver disease to atrial fibrillation through transcriptome data analysis”,这篇文章于2023年10月16日发表在Sci…