当前位置: 首页 > news >正文

设计模式行为型——中介者模式

目录

什么是中介者模式

中介者模式的实现

中介者模式角色

中介者模式类图

中介者模式代码实现

中介者模式的特点

优点

缺点

使用场景

注意事项

实际应用


什么是中介者模式

        中介者模式(Mediator Pattern)属于行为型模式,是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。用一个中介者对象来封装一系列的对象交互,中介者使各对象不需要显示地相互引用,且可以独立地改变它们之间的交互。

        中介者模式又叫调停者模式,是一种对象行为型模式。

中介者模式的实现

中介者模式角色

  1. 抽象中介者角色(Mediator):抽象中介者角色定义统一的接口,以及一个或者多个事件方法,用于各同事角色之间的通信。
  2. 具体中介者角色(ConcreteMediator):实现了抽象中介者所声明的事件方法,协调各同事类之间的行为,持有所有同事类对象的引用。
  3. 抽象同事角色(Colleague):定义了抽象同事类,持有抽象中介者对象的引用。
  4. 具体同事角色(ConcreteColleague):继承抽象同事类,实现自己业务,通过中介者跟其他同事类进行通信,都需要认识中介者。

中介者模式类图

中介者模式代码实现

抽象中介者角色

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体中介角色 具体中介者* @date 2023/08/04 09:27:57*/
public class ConcreteMediator extends Mediator{@Overridepublic void operation(Colleague colleague){if(colleague instanceof ConcreteColleagueA) {colleagues.get(0).update();}else if(colleague instanceof ConcreteColleagueB) {colleagues.get(1).update();}}
}

具体中介者角色

    package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体中介角色 具体中介者* @date 2023/08/04 09:27:57*/public class ConcreteMediator extends Mediator{@Overridepublic void operation(Colleague colleague){if(colleague instanceof ConcreteColleagueA) {colleagues.get(0).update();}else if(colleague instanceof ConcreteColleagueB) {colleagues.get(1).update();}}}

抽象同事角色

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 抽象同事角色 抽象同事类* @date 2023/08/04 09:21:50*/
public abstract class Colleague {/*** 抽象中介者引用*/protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}/*** 数据更新方法*/public abstract void update();/*** 数据更改方法*/public abstract void changed();
}

具体同事角色

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体同事角色 具体同事小A* @date 2023/08/04 09:24:46*/
public class ConcreteColleagueA extends Colleague{public ConcreteColleagueA(Mediator mediator){super(mediator);}@Overridepublic void update() {System.out.println("更新同事小A");}@Overridepublic void changed() {System.out.println("同事小A数据更改");mediator.operation(this);}
}
package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体同事角色 具体同事小B* @date 2023/08/04 09:24:46*/
public class ConcreteColleagueB extends Colleague{public ConcreteColleagueB(Mediator mediator){super(mediator);}@Overridepublic void update() {System.out.println("更新同事小B");}@Overridepublic void changed() {System.out.println("同事小B数据更改");mediator.operation(this);}
}

测试代码

package com.common.demo.pattern.mediator;/*** @author Evan Walker 昂焱数据: https://www.ayshuju.com* @version 1.0* @desc 具体中介角色 具体中介者* @date 2023/08/04 09:27:57*/
public class ConcreteMediator extends Mediator{@Overridepublic void operation(Colleague colleague){if(colleague instanceof ConcreteColleagueA) {colleagues.get(0).update();}else if(colleague instanceof ConcreteColleagueB) {colleagues.get(1).update();}}
}

测试截图

 

中介者模式的特点

优点

  1. 解耦对象之间的交互:中介者模式将对象间的交互逻辑封装到中介者对象中,使得各个对象之间的关系变得松耦合,减少了对象之间的直接依赖。
  2. 集中控制交互逻辑:中介者模式通过集中控制对象间的交互逻辑,使得代码更加清晰可维护,易于扩展和修改。
  3. 简化对象间的通信:中介者模式将对象间的通信封装到中介者对象中,对象只需要关注自身的业务逻辑,无需了解其它对象的具体实现细节。

缺点

  1. 中介者对象过于复杂:随着系统的复杂性增加,中介者对象可能会变得庞大复杂,维护和理解起来相对困难。
  2. 增加了系统的单一点故障:中介者对象负责协调对象之间的交互,一旦中介者对象出现问题,可能会影响系统的稳定性。

使用场景

  1. 多个对象之间存在复杂的交互关系:当对象之间存在复杂的交互逻辑,并且彼此之间的依赖关系较高时,可以考虑使用中介者模式。
  2. 需要集中控制对象间交互逻辑的情况:当需要集中管理和控制多个对象的交互逻辑时,可以使用中介者模式简化系统的设计。

注意事项

  1. 中介者模式需要注意中介者对象的设计和组织方式,以及与其他对象的交互关系,避免中介者对象过于庞大和复杂。
  2. 不要滥用中介者模式,只有在对象间的交互逻辑较为复杂、耦合度较高时才考虑使用中介者模式。

实际应用

  1. 聊天室:聊天室中的用户可以通过中介者对象发送消息和接收消息,中介者负责将消息传递给其他用户。
  2. MVC框架:在MVC框架中,控制器作为中介者对象,接收用户的请求并协调模型和视图之间的交互。
  3. 航空管制系统:航空管制系统中的空中交通管制中心可以看作是中介者,负责协调各个飞机的航行和地面设施之间的交互。


更多消息资讯,请访问昂焱数据(https://www.ayshuju.com)

相关文章:

设计模式行为型——中介者模式

目录 什么是中介者模式 中介者模式的实现 中介者模式角色 中介者模式类图 中介者模式代码实现 中介者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是中介者模式 中介者模式(Mediator Pattern)属于行为型模式,是用来降低…...

Vue——formcreate表单设计器自定义组件实现(二)

前面我写过一个自定义电子签名的formcreate表单设计器组件,那时初识formcreate各种使用也颇为生疏,不过总算套出了一个组件不是。此次时隔半年又有机会接触formcreate,重新熟悉和领悟了一番各个方法和使用指南。趁热打铁将此次心得再次分享。…...

人脸验证(Face verification) 和 人脸识别(Face recognition) 的区别

人脸验证(Face verification) 和 人脸识别(Face recognition) 的区别 Face verification 和 Face recognition 都是人脸识别的技术,但是它们的应用和目的不同。 Face verification(人脸验证)是指通过比对两张人脸图像,判断它们是…...

前端如何打开钉钉(如何唤起注册表中路径与软件路径不关联的软件)

在前端唤起本地应用时,我查询了资料,在注册表中找到腾讯视频会议的注册表情况,如下: 在前端代码中加入 window.location.href"wemeet:"; 就可以直接唤起腾讯视频会议,但是我无法唤起钉钉 之所以会这样&…...

数据可视化入门指南

数据可视化是一种将抽象的数值和数据转换为易于理解的图像的方法。它可以帮助人们更好地理解数据的含义,并且可以揭示数据中可能被忽视的模式和趋势。本文将为你提供一个简单的数据可视化入门指南。 为什么数据可视化重要? 在我们的生活中,数…...

React 18 响应事件

参考文章 响应事件 使用 React 可以在 JSX 中添加 事件处理函数。其中事件处理函数为自定义函数,它将在响应交互(如点击、悬停、表单输入框获得焦点等)时触发。 添加事件处理函数 如需添加一个事件处理函数,需要先定义一个函数…...

面试总结-c++

1该吹牛逼吹牛逼。在自己能说出个所以然的情况下,该吹就吹,不吹没工作,吹了有希望。 比如 c组长,确有其事,但是挺唬人。说自己在北京定居也是侧面吹牛逼,证明自己的能力。还有媳妇在研究所。 2.对自己做过…...

Spring(九) - 解惑 spring 嵌套事务.2

1. 事务传播特性 在所有使用 spring 的应用中, 声明式事务管理可能是使用率最高的功能了, 但是, 从我观察到的情况看,绝大多数人并不能深刻理解事务声明中不同事务传播属性配置的的含义, 让我们来看一下 TransactionDefinition 接口中的定义 Java代码 /** * Support a cu…...

Android Studio API 33 获取当前连接的WIFI名称

常规流程失败流程 常规流程 以下内容在 API 33 成功实现&#xff0c;低版本API还请自行尝试&#xff08;仅推荐 API 29 - 33 用户食用&#xff09; 先&#xff08;至少&#xff09;添加以下权限到你的 AndroidManifest.xml 文件 <uses-permission android:name"andr…...

ICCV 2023 | 半监督三维目标检测新SOTA:密集匹配和量化补偿

论文链接&#xff1a;https://arxiv.org/abs/2304.13031 开源代码仓库地址&#xff1a;https://github.com/AIR-DISCOVER/DQS3D 方法效果对比图&#xff1a;有效在半监督情况下处理临近小物体 01. 简介 本文旨在解决三维室内场景中高昂的标注成本问题&#xff0c;特别关注半监…...

python+django+mysql项目实践三(用户管理)

python项目实践 环境说明: Pycharm 开发环境 Django 前端 MySQL 数据库 Navicat 数据库管理 用户列表展示 urls view models html <!DOCTYPE html> <html...

Java多线程 | 操作线程的方法详解

文章目录 一、线程的启动1.1 start()方法 二、线程的休眠与中断2.1 Thread.sleep()方法2.2 interrupt()方法 三、线程的等待与唤醒3.1 wait()方法3.2 Object类的notify()和notifyAll()方法3.3 await()和signal()方法3.4 使用join()方法等待线程执行完成 四、线程的状态控制与管…...

【ConcurrentHashMap1.7源码】十分钟带你深入ConcurrentHashMap并发解析

ConcurrentHashMap1.7源码 四个核心要点 初始化PUT扩容GET Unsafe 初始化 五个构造方法 /*** Creates a new, empty map with the default initial table size (16).*/public ConcurrentHashMap() {}/*** Creates a new, empty map with an initial table size* accommodati…...

程序框架-事件中心模块-观察者模式

一、观察者模式 1.1 观察者模式定义 意图&#xff1a; 定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变是&#xff0c;所有依赖于它的对象都能得到通知并自动更新。 适用性&#xff1a; 当一个对象状态的改变需要改变其他对象&#xff0c; 或实际对…...

通过AOP的ProceedingJoinPoint获取方法信息

文章目录 ProceedingJoinPoint用法 ProceedingJoinPoint用法 获得切点对应的方法&#xff08;Method&#xff09; 本处Method指的是java.lang.reflect.Method 若切入点表达式是方法&#xff0c;则获得的是切入点方法的信息。若切入点表达式是注解&#xff0c;则获得的是使用了…...

【JavaSE】初步认识类和对象

【本节目标】 1. 掌握类的定义方式以及对象的实例化 2. 掌握类中的成员变量和成员方法的使用 3. 掌握对象的整个初始化过程 目录 1. 面向对象的初步认知 2. 类定义和使用 3. 类的实例化 4. this引用 1. 面向对象的初步认知 1.1 什么是面向对象 Java是一门纯面向对象的语…...

python中的matplotlib画饼图(数据分析与可视化)

直接开始 1、先安装pandas和matplotlib pip install pandas pip install matplotlib2、然后在py文件中导入 import pandas as pd import matplotlib.pyplot as plt3、然后直接写代码 import pandas as pd import matplotlib.pyplot as pltpd.set_option("max_columns&…...

用Rust实现23种设计模式之 职责链模式

关注我&#xff0c;学习Rust不迷路&#xff01;&#xff01; 优点 解耦&#xff1a;职责链模式将请求发送者和接收者解耦&#xff0c;使得多个对象都有机会处理请求&#xff0c;而不是将请求的发送者和接收者紧密耦合在一起。灵活性&#xff1a;可以动态地改变或扩展处理请求…...

进销存管理中的技术创新和数字化转型

在进销存管理中&#xff0c;技术创新和数字化转型可以通过以下具体的应用案例来实现&#xff1a; 自动化仓储系统&#xff1a;利用自动化技术和机器人系统来管理仓库操作&#xff0c;包括货物的装卸、分拣和存储。这可以提高仓库的运作效率&#xff0c;减少人力成本&#xff0…...

与“云”共舞,联想凌拓的新科技与新突破

伴随着数字经济的高速发展&#xff0c;IT信息技术在数字中国建设中起到的驱动和支撑作用也愈发凸显。特别是2023年人工智能和ChatGPT在全球的持续火爆&#xff0c;更是为整个IT产业注入了澎湃动力。那么面对日新月异的IT信息技术&#xff0c;再结合疫情之后截然不同的经济环境和…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中&#xff0c;新增了一个本地验证码接口 /code&#xff0c;使用函数式路由&#xff08;RouterFunction&#xff09;和 Hutool 的 Circle…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...