中介者模式(二十一)

相信自己,请一定要相信自己

上一章简单介绍了观察者模式(二十), 如果没有看过, 请观看上一章

一. 中介者模式

引用 菜鸟教程里面中介者模式介绍: https://www.runoob.com/design-pattern/mediator-pattern.html

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。

这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

中介者模式属于行为型模式

一.一 介绍

意图: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,
而且可以独立地改变它们之间的交互。

主要解决: 对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,
同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用: 多个类相互耦合,形成了网状结构。

如何解决: 将上述网状结构分离为星型结构。

关键代码: 对象 Colleague 之间的通信封装到一个类中单独处理。

应用实例:
1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
2、机场调度系统。
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点: 中介者会庞大,变得复杂难以维护。

使用场景:
1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项: 不应当在职责混乱的时候使用。


组成角色具体关系
抽象中介者(Mediator)Mediator抽象中介者,定义了同事对象到中介者对象的接口
具体的中介者对象(ConcreteMediator)ConcreteMediator抽象同事类
抽象同事类(Colleague)Colleague抽象同事类
具体同事类(ConcreteColleague)PhoneColleague,TVColleague具体的同事类,会有很多, 每个同事只知道自己的行为,而不了解其他同事类的行为(方法), 但 是他们都依赖中介者对象

image-20230615190357472

二. 中介者模式实例

二.一 抽象同事类 Colleague

@Data
public abstract class Colleague {private String name;private Mediator mediator;public Colleague (String name, Mediator mediator) {this.name = name;this.mediator = mediator;}public abstract void sendCmd(String cmd);
}

二.二 具体同事类实现

二.二.一 手机实现

@Slf4j
public class PhoneColleague extends Colleague{public PhoneColleague(String name, Mediator mediator) {super(name,mediator);// 注册到中介集合里面。mediator.register(name,this);}@Overridepublic void sendCmd(String cmd) {getMediator().getCmdMessage(this.getName(),cmd);}public void call() {log.info(">>> {} 打电话",super.getName());}public void wx() {log.info(">>>>> {}打开微信",super.getName());}}

二.二.二 TV实现

@Slf4j
public class TVColleague extends Colleague{public TVColleague (String name, Mediator mediator) {super(name,mediator);// 注册到中介集合里面。mediator.register(name,this);}@Overridepublic void sendCmd(String cmd) {getMediator().getCmdMessage(this.getName(),cmd);}public void on() {log.info(">>> {} 开启电视",super.getName());}public void off() {log.info(">>>>> {} 关闭电视",super.getName());}}

二.三 抽象中介者 Mediator

public interface  Mediator {void register (String name, Colleague colleague) ;void getCmdMessage (String name, String cmd);}

二.四 具体中介者 ConcreteMediator

public class ConcreteMediator implements Mediator{private HashMap <String,Colleague> colleagueHashMap = new HashMap<>();@Overridepublic void register(String name, Colleague colleague) {colleagueHashMap.put(name,colleague);}@Overridepublic void getCmdMessage(String name, String cmd) {// 根据名称,获取信息.Colleague colleague = colleagueHashMap.get(name);if (colleague == null) {return ;}if (colleague instanceof TVColleague) {// 是电视相应的TVColleague tvColleague = (TVColleague) colleague;if ("on".equals(cmd)){tvColleague.on();}else if ("off".equals(cmd)){tvColleague.off();}}else if (colleague instanceof PhoneColleague) {// 是电视相应的PhoneColleague phoneColleague = (PhoneColleague) colleague;if ("call".equals(cmd)){phoneColleague.call();}else if ("wx".equals(cmd)){phoneColleague.wx();}}}
}

二.五 客户端调用

 @Testpublic void oneTest(){ConcreteMediator concreteMediator = new ConcreteMediator();Colleague tv1 = new TVColleague("tv1",concreteMediator);Colleague phone1 = new PhoneColleague("ph1",concreteMediator);Colleague phone2 = new PhoneColleague("ph2",concreteMediator);// 发送指令tv1.sendCmd("on");phone1.sendCmd("wx");phone2.sendCmd("call");}

image-20230615191126214

优点:

1.多个类相互耦合,会形成网状结构, 使用中介者模式将网状结构分离为星型结构,进行解耦

  1. 减少类间依赖,降低了耦合,符合迪米特原则

缺点:

  1. 中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
  2. 如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意

本章节的代码放置在 github 上:


https://github.com/yuejianli/DesignPattern/tree/develop/Mediator


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

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

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

相关文章

rabbitmq安装步骤和遇到的问题

一、安装准备工具 1.下载Eralng&#xff0c;下面链接已提供otp_win64_20.2.exe 链接&#xff1a; https://pan.baidu.com/s/1lmvCMPVAV1Ba9UogCdQpZg 提取码&#xff1a;x9m7 2.下载rabbitmq&#xff0c;下面链接已提供rabbitmq-server-3.7.4.exe 链接&#xff1a; https:…

vtkdicom0.8_vtk9.2_dcmtk3.6.7_qt6.2编译OK

目录 0 结果展示 1 cmake要点 2 编译报错解决 3 参考链接 0 结果展示 1 cmake要点 注意DCMTK_dcmtk_INCLUDE_DIR 2 编译报错解决 D:\Work\C\qt6Work\DCMTK\install\bin\dcmtkcharls.dll : fatal error LNK1107: 文件无效或损坏: 无法在 0x308 处读取 修改&#xff0c;从…

【Linux】在Ubuntu下部署nginx——nginx的负载均衡

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

【博客679】LVS NAT模式与FULLNAT模式原理与配置差别

LVS NAT模式与FULLNAT模式原理与配置差别 注意&#xff1a; LVS NAT模式是LVS原生的一种工作方式&#xff0c;而FULLNAT是在NAT模式下通过配置SNAT来 实现FULLNAT的&#xff0c;而且配合SNAT这部分是靠我们自己来实现的 1、LVS NAT模式原理与特点 NAT模式的数据包请求流程&…

Atlas 200I DK A2开发者套件通过路由器联网(360安全路由-V2)

一、参考资料 Windows系统 通过直连路由器连接外部网络 二、准备工作 准备micro SD存储卡&#xff0c;即TF卡&#xff0c;建议128GB以上&#xff1b;准备micro SD读卡器&#xff1b;准备普通网线一根&#xff1b;准备一个路由器&#xff0c; 360安全路由-V2路由器。 三、关键…

【MOOC 作业】第5章 链接层

不是标答也不是参考答案 仅从个人理解出发去做题 1、(20分) 在某网络中标识为 A 到 E 的 5 个结点以星形与一台交换机连接&#xff0c;考虑在该网络环境中某个正在学习的交换机的运行情况。假定&#xff1a;该交换机表初始为空。B 向 E 发送一个帧&#xff0c;此时交换机将该数…

多服务器云探针源码(服务器云监控)

全球服务器分布世界地图 服务器&#xff08;控制端&#xff09; ping 连通率功能 后台编辑 添加 删除 服务器&#xff08;控制端&#xff09; 生成服务器&#xff08;控制端&#xff09;一键安装脚本 在线 SSH 多服务器批量执行命令 多服务器定制分享地址 控制游客那些服…

ROS学习篇之硬件准备(零)-thinkbook16+锐龙版 安装ubuntu20.04遇到的各种坑

文章目录 一.计算机配置二.遇到的问题及解决办法1.键盘失灵2.无法联wifi3.蓝牙搜索不到设备4.无法开热点 三.最后的感想 一.计算机配置 CPU: AMD R7 6800H &#xff08;网卡&#xff0c;娱乐大师读出来的不对&#xff0c;在windos系统下&#xff0c;联想管家读出来网卡的型号是…

WebSocket

WebSocket WebSocket 事HTML5开始提供的一种在单个TCP连接上进行的双工通讯的协议&#xff0c;可以在html页面直接使用。 WebSocket使用客户端何服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推动数据。在WebSocketAPI中&#xff0c;浏览器和服务器只…

JVM类加载机制

一、类的加载过程&#xff08;从磁盘到内存的过程&#xff09; 1、整体过程概述 我们首先以一个类举例&#xff0c;一个类的加载首先是通过某个main函数启动程序时&#xff0c;通过类加载器把主类加载到jvm中&#xff0c;如&#xff1a; package com.gaorufeng.jvm;public c…

远程桌面发生身份验证错误,要求的函数不受支持

windows10专业版&#xff1a; 解决方法&#xff1a; 使用微软官方建议修改本地组策略&#xff1a; winr弹出运行窗口&#xff0c;输入gpedit.msc,打开本地组策略 计算机配置>管理模板>系统>凭据分配>加密Oracle修正 选择启用并选择易受攻击。 windows10家庭版&a…

如何调用百度地图API

前言 要调用百度地图API&#xff0c;步骤操作如下 注册并创建一个API密钥。您可以在百度地图API控制台上创建您的密钥。选择要使用的API服务。百度地图API提供了多种服务&#xff0c;包括地图展示、路线规划、地点搜索、实时交通等。您可以在百度地图API控制台上查看所有可用…