中介者(Mediator)模式

news2024/7/6 18:27:18

目录

  • 动机
  • 使用场景
  • 参与者
  • 协作
  • 效果
  • 实现
  • 相关模式
  • 应用和思考

中介者(Mediator)是对象行为模式,用一个中介对象来封装一系列对象的交互。中介者使各对象不需要显式的相互应用,从而使其耦合松散,而且可以独立的改变他们之间的交互

动机

面向对象设计鼓励将行为分到各个对象中。这种分布可能会导致对象间有许多连接,在最坏的情况下每一个对象都知道其他所有对象

使用场景

  • 一组对象以定义良好但复杂的方式通信,产生的相互依赖关系结构混乱且难以理解
  • 一个对象引用其他对象并且直接与这些对象通信,导致难以复用该对象
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类

参与者

  • Mediator:中介者定义一个接口用于与各同事对象通信
  • ConcreteMediator:
    • 具体中介者通过协调各同事对象实现协作行为
    • 了解并维护它的各个同事
  • Colleague:
    • 每一个同事类都知道它的中介者对象
    • 每一个同事对象在需与其他同事通信的时候与它的中介者通信,就用到了Mediator中定义的用于与各同事对象通信的接口

协作

同事向一个中介者发送和接收请求,中介者在各同事间适当地转发请求以实现协作行为

效果

  • 减少了Collegue子类的生成。Mediator将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成Mediator的子类即可,这样各个Colleague类可被重用(副作用是Mediator子类增多);Colleague子类和中介者模式本身有关系吗?如在国家的例子中,引入另一个新的国家不管是否用到模式都需要添加新类。
  • 将各Colleagues解耦。可以独立的改变和复用Colleague和Mediator类
  • 简化了对象协议——一个ConcreteMediator封装了各Colleagues之间的交互协议,用户只需持有一个ConcreteMediator即可
  • 对对象如何协作进行了抽象——抽象如何协作有什么作用呢?
  • 使控制集中化

实现

  • 当各Colleagues仅与一个Mediator工作时不需要定义抽象的Mediator
  • Colleague对象需要持有Mediator的指针对象;各ConcreteMediator对象需要持有各个交互的ConcreteColleague对象指针
  • Colleague-Mediator通信,有两种方式:
    • 使用Observer模式,将Mediator实现为一个Observer,各Colleague所谓Subject,一旦状态改变就发送通知给Mediator,Mediator作出的响应是将状态改变的结果传播给其他的Colleagues
    • 在Mediator中定义一个特殊的通知接口,各Colleagues在通信时直接调用该接口(联合国的例子就是用这种方式):怎样判断是那个同事类型发起的请求?

相关模式

Facade模式与Mediator模式的不同之处在于,它是对一个对象子系统进行抽象,从而提供了一个更为方便的接口。它的协议是单向的,即Facade对象对这个子系统类提出请求,但反之不行

应用和思考

  • 书中的例子没有搞懂:比如在实际应用中,button的响应函数应该在button所属的dialog中而不是button中,在中介者模式下响应函数应该在什么地方?
  • 各个Colleagues之间没有包含关系了,他们之间的所有关联都放到对应的Mediator中了
  • 用户创建各Mediator对象和Colleague对象,用户操作某个Colleague对象通过Mediator完成各对象之间的交互
  • 有可能存在一个Colleague对象需要多个Mediator对象,以世界各国为例,某国在WHO中的提议和在WTO中的提议,一个国家的态度是不一样的,这时就需要不同的ConcreteMediator,但Colleague是保存一个还是若干个Mediator对象?应该是需要依具体情况而定,该保存多个的时候就保存多个
    在这里插入图片描述

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

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

相关文章

光学卷积处理芯片---自动驾驶高性能运算平台的福音?

摘要: 本文提到的在低损耗氮化硅平台上制造的紧凑片上光学卷积处理单元,可以展示出其大规模集成的能力。 深度学习的处理模式是我们在在自动驾驶环境目标分类、识别、跟踪等场合下不可或缺的重要一环。随着自动驾驶技术的不断演进,要求处理的…

怎么学习核心Java相关的技术和知识? - 易智编译EaseEditing

学习核心Java相关的技术和知识可以按照以下步骤进行: 学习Java基础: 从Java语言的基础知识开始学习,了解语法、数据类型、运算符、控制流程等基本概念。 可以通过在线教程、书籍或学习资源进行自学,如Oracle官方的Java教程、Ja…

funbox2靶场笔记

信息收集开放21,22,80端口 21端口存在ftp匿名访问,下载压缩包,有密码,直接破解 ftp简单命令 ftp ip anonymous#匿名用户 ls cd pwd lpwd get pwd mget 使用工具fcrackzip fcrackzip -D -u -p rockyou.txt tom.zip -D 使用字典 rockyou字…

反射的基础部分知识

反射的基础——Class Java当中的类用来表示具有相同属性和方法的对象的集合,是抽象的概念。对象是类创建的,同一个类的不同对象具有不同的属性值。 Java当中定义的所有类都属于同一类事物,可以Class来表示。 类型 访问方法 返回值类型 说…

MySQL数据库管理(二)

文章目录 一.表结构(增加字段)1.创建表结构2.复制数据表2.1 复制格式2.2 克隆表 3.清空表,删除表内的所有数据4.创建临时表 二.MySQL中6种常见的约束1.外键的定义2.创建外键约束作用3.创建主表blue4.创建从表Icecream5.为主表blue添加一个主键约束。主键名建议以&qu…

JAVA - 内存管理

目录 内存管理是什么 JVM内存区域组成 程序计数器PC java虚拟机栈 本地方法栈 JAVA堆 方法区 常量池 运行时常量池 内存管理是什么 Java的内存管理就是对象的分配和释放问题 分配 :内存的分配由程序完成的,程序员通过关键字new 为每个对象申请…

mysql视图的简单应用

1、创建一视图 stu_info,查询全体学生的姓名,性别,课程名,成绩。 create view stu_info(姓名,性别,课程名,成绩) as select Sname,Ssex,Cname,Score from Course,SC,Student where Student.Sno SC.Sno and SC.Cno Course.Cno;去查看视图 …

混合云监控

混合云基础架构的增长是由增强的灵活性、成本优化机会以及对敏捷 DevOps 文化的支持等优势推动的。另一方面,在混合云环境中很难实现可见性、问责制和控制,这被证明是混合云成功的障碍。尽管公共云提供商提供了用于监控服务可用性的控制台,但…

将媒体公司资产迁移到 Amazon S3 的技术方案

随着媒体公司的发展,他们在仓库中积累了大量的旧磁带和未数字化的视频。这些资产可能很有价值,但以目前的形式很难访问和货币化。此外,将这些资产存储在仓库中既有风险又昂贵。 媒体企业可以通过将其资产迁移到云存储来解决这些问题&#xf…

MySQL练习题(5)

创建表并插入数据 1、创建一个可以统计表格内记录条数的存储函数 ,函数名为count_sch() select count_sch() 2、创建一个存储过程avg_sai,有3个参数,分别是deptno,job,接收平均工资, 功能查询emp表dept为30…

开放式蓝牙耳机测评!2023年值得入手的开放式蓝牙耳机都在这里!索尼、南卡、韶音、飞利浦等等品牌,看看有没有适合你的款式!

这可能是站内最详细的开放式蓝牙耳机选购攻略!想入手开放式蓝牙耳机必看! 在这个人人手机不离手的快节奏时代,蓝牙耳机自然是越多越多人的选择,而随着耳机种类的进化代送,开放式蓝牙耳机,也随之被大众熟知…

【面试题39】能够使HTML和PHP分离开使用的模板技术有哪些

文章目录 一、前言二、模板技术的好处三、常用的模板技术3.1 PHP模板引擎3.2 前端模板引擎3.3 前后端分离技术 四、Smarty模板使用演示4.1 在项目中引入Smarty模板引擎的文件4.2 引入Smarty.class.php文件4.3 创建一个Smarty对象4.4 变量定义4.5 创建一个Smarty模板文件4.6 绑定…

无需魔法三分钟上线Midjourney应用,【附源码】【示例】

ps:我是标题党,目前还没见过三分钟完成任务的,三分钟只能打通Midjourney接口。我花了一天时间接入应用哈哈哈! 首先,我要感谢laf赞助我,让我可以免费使用Midjourney进行开发和测试。来自白嫖党的快乐。 其次&#xff…

基于linux下的高并发服务器开发(第一章)- 静态库和动态库的对比1.9

01 / 程序编译成可执行程序的过程 静态库、动态库区别来自链接阶段如何处理,链接成可执行程序。分别称为静态链接方式和动态链接方式。 02 / 静态库的制作过程 03 / 动态库的制作过程 04 / 静态库的优缺点 05 / 动态库的优缺点

[工具推荐] LICEcap 动图gif录制工具 轻量/开源/免费

先声明:不是广子,单纯分享 LICEcap 之前用Windows时,就用这个软件 后来用mac了,发现它也有mac版的,也支持m1芯片的苹果电脑 这是目前用过最轻量的gif录制软件了, 程序整体都不到1mb 该有的功能都有&a…

『表面』无序点云的快速三角化

1、PCL中的贪婪投影三角化(GreedyProjectionTriangulation)算法 该算法用于将无序点云数据转换为表面三角网络模型的表面重建算法。可以根据点云数据中的几何信息,自动构建出具有连续性和平滑性的三角网络模型。 具体步骤: 预处…

马斯克在与创业公司OpenAI竞争的新竞标中公布了xAI

北京时间7月13日凌晨,马斯克在Twiiter上毫无预警地宣布:“xAI正式成立,去了解现实。”(Announcing formation of xAI to understand reality.)这是马斯克首次官宣xAI的进展。 xAI的Twitter账号中目前还没有多少内容&a…

嵌入式Linux开发实操(四):pinctrl和dt_binding

Linux/pinctrl subsystem,统一了各SOC/MCU厂商的PIN引脚管理了吗? pin命名遵循IC spec上的命名。它是如何实现驱动到硬件的对接的呢?在CPU、Memory等完成初始化加载之后,显然就进入到了嵌入式linux的核心部分,管理对接硬件,这正是pinctrl要完成的工作。 Linuxpinctrl架构…

el-date-picker 日期时间进行限制,精确到时分秒

需求:用户只能选择当时时间或当前时间之前的时间,且精确到时分秒 实现效果:用户只能选择当前时间的时间,如果选择是当天之前的时间,时分秒不做限制,如果选择的是当天时间,就要判断时分秒&#…

Stable Diffusion 丝滑无闪烁AI动画 Temporalkit+Ebsynth+Controlnet

早期的EbSynth制作的AI视频闪烁能闪瞎人的双眼,可以通过【temporalkit+ebsynth+controlnet】让视频变得丝滑不闪烁。 文章目录 插件准备丝滑视频制作插件准备 下载安装 EbSynth官网,这里需要输入email地址。 下载压缩包解压缩到任意位置,这里我放到了ebsynth_utility下。 …