03-JAVA设计模式-中介者模式

中介者模式

什么是中介者模式

中介者模式(Mediator Pattern)是一种行为设计模式,用于减少对象之间的直接依赖关系,降低它们之间的耦合度,并使得一个对象改变时,所有依赖于它的对象都得到通知并自动更新。在中介者模式中,一个中介者对象来封装一系列对象之间的交互,从而使这些对象不需要显式地相互引用,降低了它们的耦合度。

在 Java 中实现中介者模式,通常涉及以下几个角色:

  • 中介者(Mediator):定义了对象之间的交互方式,协调多个对象之间的行为。
  • 同事类(Colleague):知道中介者的存在,与中介者进行交互,而不需要与其他同事类直接交互。

中介者模式的本质

解耦各个同事对象之间的交互关系。每个对象都持有中介者对象的引用,只跟中介者对象打交道。我们通过中介者对象统一管理这些交互关系。

常见使用场景:

  • MVC模式其中C,控制器就是一个中介者对象,M和V都和它打交道。
  • 窗口游戏程序,窗口软件开发中窗口对象也是一个中介者对象
  • 图形界面卡法GUI中,多个组件只见的交互,可以通过引入一个中介者对象来解决,可以是整体的窗口对象或者DOM对象
  • java.lang.reflect.Method#invoke()

案例

A发送消息通过中介者转发给B接收

UML

在这里插入图片描述

实现步骤:

  • 定义同事类接口,接口中定义处理自己事情,接收消息及向中介者发送申请接口
  • 定义中介者接口,接口中定义注册及处理接口
  • 定义同事A,构造方法中传入中介者获取中介者的引用,及完成注册,实现同事类接口
  • 定义同事B,构造方法中传入中介者获取中介者的引用,及完成注册,实现同事类接口
  • 定义中介者实现类,通过MAP存储注册信息及完成转发动作

实现代码

Colleague.java

// 同事类接口
public interface Colleague {// 处理自己的事void selfAction();// 接收消息void receiveAction();// 向中介者发出申请void outAction(String name);
}

Mediator.java

// 中介者接口
public interface Mediator {// 注册接口void register(String name,Colleague colleague);// 处理接口void command(String name);
}

ColleagueA.java

// 同事A
public class ColleagueA implements Colleague{/** 持有中介者的引用 **/private Mediator mediator;public ColleagueA(Mediator mediator) {this.mediator = mediator;// 注册到中介者中mediator.register("A",this);}@Overridepublic void selfAction() {System.out.printf("%s-发出信息%n",this.getClass().getSimpleName());}@Overridepublic void receiveAction() {System.out.printf("%s-接收信息进行处理%n",this.getClass().getSimpleName());}@Overridepublic void outAction(String name) {System.out.printf("%s-向中介者发出申请%n",this.getClass().getSimpleName());this.mediator.command(name);}
}

ColleagueB.java

// 同事B
public class ColleagueB implements Colleague{/** 持有中介者的引用 **/private Mediator mediator;public ColleagueB(Mediator mediator) {this.mediator = mediator;// 注册到中介者中mediator.register("B",this);}@Overridepublic void selfAction() {System.out.printf("%s-发出信息%n",this.getClass().getSimpleName());}@Overridepublic void receiveAction() {System.out.printf("%s-接收信息进行处理%n",this.getClass().getSimpleName());}public void outAction(String name) {System.out.printf("%s-向中介者发出申请%n",this.getClass().getSimpleName());this.mediator.command(name);}
}

ConcreteMediator.java

import java.util.HashMap;
import java.util.Map;// 中介者的具体实现
public class ConcreteMediator implements Mediator {/** 定义存储同事集合 */private Map<String,Colleague> map = new HashMap<String,Colleague>();@Overridepublic void register(String name, Colleague colleague) {map.put(name,colleague);}@Overridepublic void command(String name) {// 传递给接收者map.get(name).receiveAction();}
}

TestClient.java

package demo1;/*** 测试类** @author Anna.* @date 2024/4/16 16:15*/
public class TestClient {public static void main(String[] args) {// 定义中介者Mediator mediator = new ConcreteMediator();// 定义同事类Colleague a = new ColleagueA(mediator);Colleague b = new ColleagueB(mediator);// A发出消息a.selfAction();// 通过中介者转发给B接收消息a.outAction("B");}
}

执行结果:

在这里插入图片描述

gitee源码

git clone https://gitee.com/dchh/JavaStudyWorkSpaces.git

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

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

相关文章

【计算机组成原理】浮点运算方法和浮点运算器

浮点加法、减法运算 浮点数加减法的步骤结合题目分析步骤 浮点数加减法的步骤 ① 0 操作数检查 ② 比较阶码大小&#xff0c;完成对阶 ③ 尾数进行加减法运算 ④ 结果规格化 ⑤ 舍入处理 ⑥ 判断结果是否溢出 结合题目分析步骤 例&#xff1a;设 x 2010 0.11011011&#x…

绿联 安装transmission

绿联 安装transmission及中文UI 1、镜像 linuxserver/transmission:latest 2、安装 2.1、创建容器 按需配置权重。 2.2、基础设置 2.3、网络 桥接即可。 注&#xff1a;如果使用IPV6&#xff0c;请选择"host"模式。 注&#xff1a;如果使用IPV6&#xff0c;请选…

【AI】Deepstream入门(2)Ubuntu20.04安装Deepstream

1、安装GPU驱动 本人显卡型号:RTX4060 Laptop(笔记本专用显卡) 【AI】惠普暗夜精灵9安装Ubuntu20.04+nvidia驱动 2、安装cuda、cuDNN 【AI】Ubuntu20.04安装cuda、cuDNN 3、安装TensorRT 1)下载 下载地址:https://docs.nvidia.com/deeplearning/tensorrt/archives/i…

海康Visionmaster-常见问题排查方法-安装阶段

VM软加密安装失败&#xff0c;报错&#xff1a;软件未激活&#xff0c;是否进行授权激活&#xff1b; 解决方法&#xff1a;如确认已完成授权&#xff0c;此时打上试用用补丁即可。补充VM400试用版本正确安装顺序如下&#xff1a; 安装顺序&#xff1a; ①安装基础安装包&…

Day39 网络编程(一):计算机网络,网络编程,网络模型,网络编程三要素

Day39 网络编程&#xff08;一&#xff09;&#xff1a;计算机网络&#xff0c;网络编程&#xff0c;网络模型&#xff0c;网络编程三要素 文章目录 Day39 网络编程&#xff08;一&#xff09;&#xff1a;计算机网络&#xff0c;网络编程&#xff0c;网络模型&#xff0c;网络…

AI时代,我要如何学习,才能跟上步伐

在21世纪这个被数据驱动的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的方方面面。无论是智能手机中的语音助手、在线客服的聊天机器人&#xff0c;还是自动驾驶汽车&#xff0c;AI的应用都在告诉我们一个信息&#xff1a;未来已来。因此&#xff0…

SQL的基础语句

1、select语句 select colums from table_name 2、条件语句 #查询出查询出用户id为1和3的用户记录 IN 操作符允许我们在 WHERE 子句中规定多个值。 select * from student where id in (1,3) #查询出所有姓王的同学 模糊查询 like 通配符(% 任意多个字符 _单个字符) #下例…

Acer宏碁掠夺者战斧300笔记本电脑PH315-52工厂模式原装Win10系统安装包 恢复出厂开箱状态 带恢复重置

宏碁掠夺者PH315-52原厂Windows10工厂包镜像下载&#xff0c;预装oem系统 链接&#xff1a;https://pan.baidu.com/s/1grmJzz6nW1GOaImY_ymXGw?pwdi286 提取码&#xff1a;i286 原厂W10系统自带所有驱动、PredatorSense风扇键盘控制中心、Office办公软件、出厂主题壁纸、系统…

【STM32+HAL+Proteus】系列学习教程---串口USART(DMA 方式)定长,不定长收发。

实现目标 1、利用UART实现上位机PC与下位机开发板之间的数据通信 2、学会STM32CubeMX软件关于UART的DMA模式配置 3、具体目标&#xff1a;1、实现串口定长收发数据通信&#xff1b;2、串口不定长收发数据通信。 一、DMA简介 1、什么是DMA? DMA&#xff08;Direct Memory …

李沐-16 PyTorch 神经网络基础【动手学深度学习v2】

注&#xff1a;1. 沐神对应章节视频出处 2.代码使用Jupyter Notebook运行更方便 3.文章笔记出处 一、层和块 层&#xff1a;层&#xff08;1&#xff09;接受一组输入&#xff0c; &#xff08;2&#xff09;生成相应的输出&#xff0c; &#xff08;3&#xff09;由一组可调整…

Node.js -- path模块

path.resolve(常用) // 导入fs const fs require(fs); // 写入文件 fs.writeFileSync(_dirname /index.html,love); console.log(_dirname /index.html);// D:\nodeJS\13-path\代码/index.html 我们之前使用的__dirname 路径 输出的结果前面是正斜杠/ &#xff0c;后面部分是…

Git基本使用(很详细)

目录 第一章、Git是什么 1.1 了解Git 1.2 Git安装 第二章、Git常用命令 2.1 常用命令 2.2 基本操作 2.2.1 打开git后端 2.2.2 设置用户签名 2.2.3 初始化本地库 2.2.4 查看本地状态 2.2.5 添加到暂存区 2.2.6 提交到本地库 2.2.7 查看历史记录 2.2.8 版本穿梭 …