C++设计模式_17_Mediator 中介者

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.mzph.cn/news/122039.shtml

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

相关文章

HCIA数据通信——基础设备配置

想了想,为了方便回顾复习,将理论和实践结合起来才是正确的,不然一边理论,又单独做实验这样不方便。 因此之前的文章都删了,还是以华为从头开始吧!实验与理论应用结合起来做。 一,查看设备信息 …

解密Kubernetes:探索开源容器编排工具的内核

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

【人脸检测 FPS 1000+】ubuntu下libfacedetection tensorrt部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

《SpringBoot项目实战》第一篇—接口参数的一些弯弯绕绕

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址:summo-springboot-interface-demo 前言 大家好!…

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具,可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月,就有一个新版本,其官网是: https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…

Harmony 个人中心(页面交互、跳转、导航、容器组件)

个人中心 前言正文一、创建工程二、登录① 更换启动页面② 拓展修饰符③ 页面跳转④ 等待进度条 三、导航栏四、首页① 轮播图② 网格列表 五、我的① 带参数跳转 六、源码 前言 今天是1024,祝各位程序员们,钱多事少离家近,不秃也强bug黄。在…

mac系统u盘启动盘制作教程,更新至macOS Sonoma 14

mac系统怎么制作装系统的u盘,如果您要在多台电脑上安装 macOS,而又不想每次都下载安装器,这时可引导安装器就会很有用。一起来看苹果电脑u盘启动盘制作教程吧。 Macos系统安装包合集包揽macos 10.15,macos 11和苹果最新系统等多个版本 1、A…

H5游戏分享-全民找房祖名qmxzfzm

H5游戏分享-全民找房祖名qmxzfzm 一开始就比较简单 后面就会越来越难&#xff0c;而且也有时间限制 游戏的源码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,ini…

嵌入式实时操作系统的设计与开发(消息)

消息 从概念上讲&#xff0c;消息机制和邮箱机制很类似&#xff0c;区别在于邮箱一般只能容纳一条消息&#xff0c;而消息则会包含一系列的消息。 系统定义了一个全局变量g_msgctr_header&#xff0c;通过它可以查找到任一已创建的消息容器。 每一个消息容器都可以根据其参数…

C++之左值、右值、std::forward、std::move总结(二百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Android Studio 导出 jar

AS版本&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

react-高阶组件

一、什么是高阶组件 高阶组件&#xff08; Higher-Order Component&#xff0c;HOC &#xff09;是一个以组件作为参数&#xff0c;返回一个新组件的函数。 高阶组件最大的特点就是复用组件逻辑高阶组件本身并不是 React 的 API&#xff0c;而是React组件的一种设计模式&…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径&#xff0c;到拼雷达、算力&#xff0c;再到如今的性价比之争&#xff0c;自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年&#xff0c;黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…

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

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

MySQL 多表查询 事务 索引

目录 多表查询简介内连接查询 join on外连接查询 left join、right join子连接查询标量子查询列子查询 (in、not in)行子查询表子查询 多表查询案例 事务事务介绍操作 start transaction、commit、rollback事务四大特性(面试题) 索引索引介绍索引原理索引语法 index 上次学习了…

【高阶数据结构】并查集和图

目录 1.数据结构--并查集 2.数据结构--图 1.图的基础概念 2.图的简单实现 2.1.邻接矩阵的图实现 2.2.邻接表的图实现 2.3.图的DFS和BFS 2.4.最小生成树 2.4.1.Kruskal(克鲁斯卡尔算法) 2.4.2.Prim&#xff08;普里姆算法&#xff09; 2.5.最短路径 2.5.1.Dijkstra(…

soc的复位reset/rst问题

本节不去讨论同步复位与异步复位以及异步复位的reset_release&#xff0c;这些问题可参考&#xff1a;芯片设计进阶之路——Reset深入理解——cy413026 本机主要回答一下几个问题。 1.片外的reset信号特别是按键reset怎么防止错误抖动的影响&#xff1f; 常见的处理方法包括两…

大数据-Storm流式框架(三)--Storm搭建教程

一、两种搭建方式 1、storm单节点搭建 2、完全分布式搭建 二、storm单节点搭建 准备 下载地址&#xff1a;Index of /dist/storm 1、环境准备&#xff1a; Java 6 Python 2.6.6 2、上传、解压安装包 3、在storm目录中创建logs目录 mkdir logs 启动 ./storm help …

解决cloudflare pages部署静态页面发生404错误的问题

cloudflare pages是一个非常方便的部署静态页面的sass工具。 但是很多人部署上去以后&#xff0c;访问服务会报404错误。什么原因&#xff1f; 原因如下图所示&#xff1a; 注意这个Build output directory, 这个是部署的关键&#xff01; 这个Build output directory目录的…

ETL工具Kettle

1 Kettle的基本概念 一个数据抽取过程&#xff0c;主要包括创建一个作业&#xff08;Job&#xff09;&#xff0c;每个作业由一个或多个作业项&#xff08;Job Entry&#xff09;和连接作业项的作业跳&#xff08;Job Hop&#xff09;组成。每个作业项可以是一个转换&#xff…