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

embedded/2024/10/18 3:22:18/

中介者模式

什么是中介者模式

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

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

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

中介者模式的本质

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

常见使用场景:

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

案例

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

UML

在这里插入图片描述

实现步骤:

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

实现代码

Colleague.java

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

Mediator.java

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

ColleagueA.java

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

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

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

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.ppmy.cn/embedded/4039.html

相关文章

设计模式:中介者模式代码案例

文章目录 示例1示例代码 示例2示例代码 示例1 一个智能家居控制系统。在这个系统中&#xff0c;我们有多个设备&#xff0c;如灯光、窗帘、空调等&#xff0c;它们之间需要相互协作以达到智能控制的目的。例如&#xff0c;当我们说“晚安”时&#xff0c;系统需要关闭灯光、拉…

Ubuntu的用户、组、权限(ACL)管理

目录 用户创建用户删除用户查看(非系统)用户 组查看所有组创建组删除组改变用户所在组从组中移除用户将用户追加到其他组 id查看用户以及所属组名字和id查看用户id查看所属组查看所属组id查看所属组名字 查看有效用户组(主组)查看有效用户组(主组)id查看有效用户组(主族)名字 权…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

安全特低电压 SELV(Safety Extra Low Voltage,缩写SELV) 是不接地系统的安全特低电压

SELV LED驱动器 市场上有很多LED灯是非隔离的&#xff0c;甚至还有灯条要100多伏特电压才能点亮的&#xff0c;安全吗&#xff1f; 国外多数LED驱动器标注了SELV&#xff0c;为什么&#xff1f; 安全特低电压 SELV(Safety Extra Low Voltage&#xff0c;缩写SELV) 是不接地系…

基于YOLOv5s的电动车入梯识别系统(数据集+权重+登录界面+GUI界面+mysql)

目录 1.UI界面 2.注册登录 3.算法准确率 4.数据集 1.UI界面 本人训练的yolov5s模型&#xff0c;准确率在98.6%左右&#xff0c;可准确完成电梯内检测电动车任务&#xff0c;并搭配了GUI检测界面&#xff0c;支持权重选择、图片检测、视频检测、摄像头检测、识别结果拍照…

基于springboot的工程教育认证的计算机课程管理平台源码数据库

基于springboot的工程教育认证的计算机课程管理平台源码数据库 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管…

Dockeri不运行容器或容器启动不起来,但需要进入容器内执行命令或修改文件

废话不多说&#xff0c;看我这个文章就能解决问题&#xff1a; 1.先删除容器 2.执行命令 docker run --rm -it --entrypoint/bin/bash 镜像名称 例如&#xff1a;进入mysql镜像 docker run --rm -it --entrypoint/bin/bash mysql:last

CSRF

什么是CSRF&#xff1f; csrf中文名称是跨站请求伪造听起来好像和xss&#xff08;跨站脚本攻击&#xff09;差不多&#xff0c;但实际上差别很大 csrf是伪造成该网站的信任用户来进行非法访问 而xss是直接通过js代码进行非法输入来获取用户的具体信息比如&#xff1a;cookie …