中介者(Mediator)模式

目录

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

中介者(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.hqwc.cn/news/20231.html

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

相关文章

【Arduino小车实践】PID应用之四驱小车

一、 PID公式 二、 PID应用的必要性 1. 四驱小车运动 左边两个驱动轮和右边两个驱动轮的速度相同直线右边轮子的速度大于左边轮子的速度左偏右边轮子的速度小于左边轮子的速度 右偏 2. 产生多种运动的原因 小车的4个电机,减速箱以及车轮在物理层面上存在误差&am…

STM32 Proteus仿真LCD12864火灾检测烟雾火焰温度报警器MQ2 -0064

STM32 Proteus仿真LCD12864火灾检测烟雾火焰温度报警器MQ2 -0064 Proteus仿真小实验: STM32 Proteus仿真LCD12864火灾检测烟雾火焰温度报警器MQ2 -0064 功能: 硬件组成:STM32F103R6单片机 LCD12864 液晶显示DS18B20 温度传感器多个按键电位…

【数据结构导论】第 5 章:图

目录 一、图的基本概念 (1)图的定义 (2)图的基本术语 (3)图的基本运算 二、图的存储结构 (1)邻接矩阵 ① 图的邻接矩阵 ② 带权图(网)的邻接矩阵 ③ 邻接矩阵的类型定…

二次-InsCode Stable Diffusion 美图活动一期

模型: AbyssOrangeMix2 - SFW_Soft NSFW_AbyssOrangeMix2_sfw.safetensors 参数配置: 正:Mountains and seas, people 负:NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochr…

模拟对讲机会被数字对讲机取代吗?

经常在网上看到有网友讨论,模拟对讲机是不是快被淘汰了,要被数字对讲机取代了。其实不管是模拟还是数字对讲机,都有其各自的优势,数字对讲要想全面取代模拟对讲,还是有些为时尚早。 传统的模拟对讲机主要是将语音、信…

贪心算法、贪心搜索/采样(greedy search/sampling)、集束搜索(beam search)、随机采样(random sample)

首先需要了解贪心算法: 贪心算法,又名贪婪法,是寻找最优解问题的常用方法,这种方法模式一般将求解过程分成若干个步骤,但每个步骤都应用贪心原则,选取当前状态下最好/最优的选择(局部最有利的选…

conda修改环境保存地址

可以在命令行中通过conda config指令进行修改 如: 添加环境目录envs_dirs conda config --add envs_dirs F:\conda_env\envs 添加pkgs_dirs conda config --add pkgs_dirs F:\conda_env\pkgs 也可以直接进入Anaconda Nacigator进行修改

星云零售信贷基于 Apache Doris 的 OLAP 演进之路

本文导读: 腾梭科技是国内领先的零售金融数字化及安全服务提供商,是腾讯投资且在金融领域的战略合作伙伴,并与腾讯联合研发了“星云智慧信贷解决方案。在其信贷业务转型过程中,随着系统规模不断扩大,早期架构无法再满…

SpringBoot + Vue 实现酒店客房管理系统

目录 1 问题的提出 5 2系统开发的可行性研究 6 2.1 技术上可行性分析 6 系统现阶段的发展过程中,利用现有人力和物力是完全具备的能力开发出来 6 2.2 经济的可行性分析 6 2.3 操作可行性分析 6 3 需求分析 7 3.1 需求描述 7 3.2 功能需求分析 7 3.3 非功能需求分析…

迭代器模式:简化集合元素遍历的设计模式

迭代器模式是一种行为型设计模式,它提供了一种遍历集合元素的统一接口,使得我们可以在不暴露集合内部结构的情况下访问集合中的元素。迭代器模式可以简化集合的遍历操作,提高代码的可读性和可维护性。本文将详细介绍迭代器模式的原理、结构和…

C++14新特性扫盲探究

闲暇之时,聊到C14,实际上C14相对之前的11并没有太大的改动,或者说更像C11标准基础上的查漏补缺,C14之后,还有17、20甚至23,所以说,C14更像个过渡版本。 下面粗略聊聊C14新特性: 语言…

让白嫖来的阿里云服务器来跑jupyter

文章目录 概要第一步 注册账号并创建实例第二步 连接实例并安装相关软件和依赖包安装python3更新pip安装jupyter生成jupyter配置文件配置之后访问云服务器jupyter的密码修改jupyter配置文件在后台启动jupyter 第三步 访问云服务器上的jupyter结语 概要 按照一般情况&#xff0…