行为型设计模式之中介者模式
中介者模式
中介者模式又称为调解者模式或调停者模式,属于行为型模式。它用一个中介对象封装系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。其核心思想是,通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。
中介者模式通过提供一个中介类,将系统各层次对象间的多对多关系变成一对多关系,将复杂的网状结构变成以调停者为中心的星形结构,达到降低系统的复杂性,提高可扩展性的作用。
应用场景
当多个类相互耦合,形成了网状结构,则可以考虑使用中介者模式进行优化。
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
飞行器驾驶员之间不会通过相互沟通来决定下一架降落的飞机。 所有沟通都通过控制塔台进行。

主要角色
1.抽象中介者(Mediator)
定义统一的接口,用于各同事角色之间的通信
2.具体中介者(ConcreteMediator)
从具体的同事对象接收消息,向具体同事对象发出命令,协调各同事间的协作
3.抽象同事类(Colleague)
每一个同事对象均需要依赖中介者角色,与其他同事间通信时,交由中介者进行转发协作
4.具体同事类(ConcreteColleague)
负责实现自发行为(Self-Method),转发依赖方法
优缺点
优点:
1.减少类间依赖,将多对多依赖转化成了一对多,降低了类间耦合;2.类间各司其职,符合迪米特法则。
缺点:
1.中介者模式中将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。
基本使用
创建抽象中介者
public abstract class Mediator {protected ConcreteColleagueA colleagueA;protected ConcreteColleagueB colleagueB;public void setColleageA(ConcreteColleagueA colleague) {this.colleagueA = colleague;}public void setColleageB(ConcreteColleagueB colleague) {this.colleagueB = colleague;}// 中介者业务逻辑public abstract void transferA();public abstract void transferB();
}
创建具体中介者
public class ConcreteMediator extends Mediator {/*** 由具体同事类A,向具体同事对象B发出指令*/@Overridepublic void transferA() {this.colleagueB.selfMethodB();}/*** 由具体同事类B,向具体同事对象A发出指令*/@Overridepublic void transferB() {this.colleagueA.selfMethodA();}
}
创建抽象同事类
public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}
}
创建具体同事类
public class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);this.mediator.setColleageA(this);}/*** 自有方法*/public void selfMethodA() {System.out.println( this.getClass().getSimpleName()+ "收到中介协作通知,selfMethodA自有方法执行");}/*** 依赖方法*/public void depMethodA() {System.out.println( this.getClass().getSimpleName()+ " depMethodA通知中介者进行转发协作");// 中介者进行转发协作this.mediator.transferA();}
}
public class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator mediator) {super(mediator);this.mediator.setColleageB(this);}/*** 自有方法*/public void selfMethodB() {System.out.println(this.getClass().getSimpleName() + "收到中介协作通知,selfMethodB自有方法执行");}/*** 依赖方法*/public void depMethodB() {System.out.println(this.getClass().getSimpleName() + " depMethodB通知中介者进行转发协作");// 中介者进行转发协作this.mediator.transferB();}
}
客户端执行
public static void main(String[] args) {// 创建抽象中介者Mediator mediator = new ConcreteMediator();// 具体同事类ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);// 中介者进行转发协作,A转发给BcolleagueA.depMethodA();System.out.println("-------------------------");// 中介者进行转发协作,B转发给AcolleagueB.depMethodB();}
ConcreteColleagueA depMethodA通知中介者进行转发协作
ConcreteColleagueB收到中介协作通知,selfMethodB自有方法执行
-------------------------
ConcreteColleagueB depMethodB通知中介者进行转发协作
ConcreteColleagueA收到中介协作通知,selfMethodA自有方法执行相关文章:
行为型设计模式之中介者模式
中介者模式 中介者模式又称为调解者模式或调停者模式,属于行为型模式。它用一个中介对象封装系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 中介者模式包装了一系列对…...
JDK8增加的特性
Java知识点总结:想看的可以从这里进入 目录13、JDK8增加的特性13.1、Lambda表达式13.2、方法的引用13.3、时间处理类13.4、接口增加方法13.5、注解新增13.6、Optional类13.7、Stream13、JDK8增加的特性 13.1、Lambda表达式 Lambda表达式和方法的引用 13.2、方法的…...
华为OD机试 - 求数组中最大n个数和最小n个数的和(Python) | 机试题+算法思路+考点+代码解析 【2023】
求数组中最大n个数和最小n个数的和 给定一个数组,编写一个函数, 计算他的最大N个数和最小N个数的和, 需要对数组进行去重。 输入 第一行输入M,M表示数组大小 第二行输入M个数,表示数组内容 第三行输入N表示需要计算的最大最小N的个数 输出 输出最大N个数和最小N个数的…...
如何写出更加契合浙大MBA项目提面申请资料?
现在已经是2月中旬了,最近看到上海很多院校都已经公布了提前面批次相应时间了,等浙大复试工作结束,马上提前面批次时间也会出来。本人2023浙大提面也拿到了优秀,结合本人经验,今天给大家分享下申请材料该如何撰写&…...
华为OD机试真题Java实现【比赛评分】真题+解题思路+代码(20222023)
比赛评分 题目 一个有N个选手参加比赛,选手编号为1~N(3<=N<=100),有M(3<=M<=10)个评委对选手进行打分。打分规则为每个评委对选手打分,最高分10分,最低分1分。 请计算得分最多的3位选手的编号。如果得分相同,则得分高分值最多的选手排名靠前(10分数量相…...
【linux】——gcc/g++,make/makefile的简单使用
目录 1.gcc的基本使用 2.Linux下的静态库和动态库的理解 3.Linux项目自动化构建工具——make/makefile 1.gcc的基本使用 gcc是专门用来编译c语言的 g是专门用来编译c的,但是g也能够用来编译c语言 预处理(进行宏替换) 预处理功能主要包括宏…...
追梦之旅【数据结构篇】——详解C语言动态实现带头结点的双向循环链表结构
详解C语言动态实现带头结点的双向循环链表结构~😎前言🙌预备小知识💞链表的概念及结构🙌预备小知识💞链表的概念及结构🙌带头结点的双向循环链表结构🙌整体实现内容分析💞1.头文件编…...
华为OD机试真题Python实现【水仙花数 2】真题+解题思路+代码(20222023)
水仙花数 2 题目 给定非空字符串 s,将该字符串分割成一些子串 使每个子串的 ASCII 码值的和均为水仙花数 若分割不成功则返回 0若分割成功且分割结果不唯一 则返回-1若分割成功且分割结果唯一 则返回分割后子串的数目 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机…...
【原创】java+swing+txt学生学籍管理系统设计与实现
今天我们来介绍如何使用javaswingtxt来开发一个学籍管理系统。对的,你没看错,我们今天不用mysql,我们使用txt这个文本来进行数据存储,主要考察对文件读写的操作。 功能分析: 我们系统不要求做的很复杂,只…...
GCN项目实战1-SimGNN
文章目录SimGNN:快速图相似度计算的神经网络方法1. 数据2. 模型2.1 python文件功能介绍2.2 重要函数和类的实现SimGNN:快速图相似度计算的神经网络方法 原论文名称:SimGNN: A Neural Network Approach to Fast Graph Similarity Computation…...
经过深思熟虑后的接口测试自动化的总结与思考
序近期看到阿里云性能测试 PTS 接口测试开启免费公测,本着以和大家交流如何实现高效的接口测试为出发点,本文包含了我在接口测试领域的一些方法和心得,希望大家一起讨论和分享,内容包括但不仅限于:服务端接口测试介绍接…...
电脑自带的录屏放在哪里了?轻松弄懂,看这篇文章就明白了
有很多小伙伴有这个疑问,电脑自带的录屏放在哪里了?其实,电脑自带的录屏工具并不是所有电脑都要,具体要看你的电脑品牌和操作系统,Windows系统和Mac系统的电脑都自带了录屏工具,下面跟着小编一起来看看吧。…...
华为OD机试真题Java实现【字符串分割】真题+解题思路+代码(20222023)
字符串分割 给定一个非空字符串S,其被N个‘-’分隔成N+1的子串,给定正整数K,要求除第一个子串外,其余的子串每K个字符组成新的子串,并用‘-’分隔。对于新组成的每一个子串,如果它含有的小写字母比大写字母多,则将这个子串的所有大写字母转换为小写字母;反之,如果它含…...
【数据库】Apache Doris : 一个开源 MPP 数据库的架构与实践
文章目录Doris 背景介绍一、Doris二、Doris 定位适用场景 & 案例介绍一、适用场景二、具体案例Doris 整体架构一、Doris 整体架构二、Doris 数据分布三、Doris 的使用方式Doris 关键技术一、数据可靠性二、易运维三、MySQL 兼容性四、支持 MPPDoris 数据模型一、Doris 数据…...
day49【代码随想录】动态规划之最长公共子序列、不相交的线、最大子序和、判断子序列
文章目录前言一、最长公共子序列(力扣1143)二、不相交的线(力扣1035)三、最大子序和(力扣53)四、判断子序列(力扣392)前言 1、最长公共子序列 2、不相交的线 3、最大子序和 4、判断…...
华为OD机试真题Python实现【字母消消乐】真题+解题思路+代码(20222023)
字母消消乐 题目 游戏规则: 输入一个只包含英文字母的字符串, 字符串中的两个字母如果相邻且相同,就可以消除。 在字符串上反复执行消除的动作, 直到无法继续消除为止,此时游戏结束。 输出最终得到的字符串长度。 🔥🔥🔥🔥🔥👉👉👉👉👉👉 华为OD机试…...
程序中的日期使用问题-格式转化:SimpleDateFormat、org.apache.commons.lang3.time.DateUtils
前言 日期使用问题主要是格式转换的问题 场景:通过excel导入数据,其中一个字段为出生日期,需要对字段值进行合法性校验 博客地址:芒果橙的个人博客 【http://mangocheng.com】 一、个人浅谈日期 时间日期作为一个基础的标识和维度…...
C++——map和set的应用总结
目录1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用3.2 multiset3.2.1 multiset的介绍3.2.2 multiset的使用3.3 map3.3.1 map的介绍3.3.2 map的使用operator[]3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用3.5 map和set在OJ中的…...
学习Python可以做什么工作?
一: 1、web开发:Python拥有非常完善与web服务器交互的库,大量的免费网页模板,相对于更具有优势,同时还具有非常优秀的Django框架,功能齐全。目前国内的豆瓣网、果壳网等,国外的Google、YouTube等…...
AWS攻略——Peering连接VPC
文章目录创建IP/CIDR不覆盖的VPC创建VPC创建子网创建密钥对创建EC2创建Peering接受Peering邀请修改各个VPC的路由表修改美东us-east-1 pulic subnet的路由修改悉尼ap-southeast-2路由测试知识点我们回顾下《AWS攻略——VPC初识》中的知识: 一个VPC只能设置在一个Re…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...

