【设计模式深度剖析】【6】【行为型】【中介者模式】

👈️上一篇:迭代器模式    |   下一篇:观察者模式👉️

设计模式-专栏👈️

---

文章目录

  • 中介者模式
  • 定义
    • 英文原文
    • 直译
    • 如何理解?
  • 中介者模式的角色
    • 1. 中介者(Mediator)
    • 2. 具体中介者(ConcreteMediator)
    • 3. 同事(Colleague)
    • 类图
    • 代码示例
  • 中介者模式的应用
    • 优点
    • 缺点
    • 使用场景

中介者模式

中介者模式Mediator)也称调停者模式

复杂的网状结构——>星型结构:通过中介者来调停每个类只与中介者有联系,通过中介者解耦。

中介者模式就像是一位“交通警察”,在繁忙的十字路口指挥车辆和行人有序通过,避免他们之间的直接冲突和混乱。

定义

英文原文

Defines a separate (mediator) object that encapsulates the interaction between a set of objects and the objects delegate their interaction to a mediator object instead of interacting with each other directly.

直译

中介者模式定义了一个单独的(中介)对象,用于封装一组对象之间的交互。这组对象将它们的交互委托给中介对象,而不是直接相互交互。

如何理解?

  • 松散耦合:中介者模式通过中介者对象封装了对象之间的交互,使得对象之间不需要直接引用,实现了松散耦合。
  • 独立变化:由于交互逻辑被封装在中介者对象中,因此可以独立地改变对象之间的交互,而不需要修改大量的代码。

假设你正在组织一个家庭聚会,有很多亲戚朋友参与。如果你让每个参与者都直接与每个人交流(例如,每个人都要告诉其他人他们的饮食偏好),那么场面可能会非常混乱,而且很难确保每个人都得到了正确的信息。这时,你可以充当一个“中介者”的角色,让每个人只与你交流他们的需求,然后你再将这些需求传达给其他人。这样,整个聚会过程就会变得更加有序和高效。这就是中介者模式在现实生活中的一个简单应用。

中介者模式的角色

1. 中介者(Mediator)

定义了一个接口,用于封装多个同事(Colleague)对象之间的交互行为,协调它们之间的通信。

  • 维护同事对象之间的关联关系。
  • 协调多个同事对象之间的交互。
  • 封装了同事对象之间的通信细节。

2. 具体中介者(ConcreteMediator)

实现了中介者接口,定义了具体的协调同事对象交互的逻辑。

  • 了解并维护它的各个同事:提供注册同事对象的方法,持有同事对象的引用列表。
  • 实现协调同事对象交互的逻辑。

3. 同事(Colleague)

持有中介者的引用,通过中介者与其他同事对象通信。

  • 每一个同事类都知道它的中介者对象:持有中介者的引用。
  • 提供注册到中介者的方法。
  • 接收来自中介者的消息。
  • 每一个同事对象在需要与其他同事通信的时候,与它的中介者通信:发送消息给中介者,再由中介者转发给其他同事。

类图

在这里插入图片描述

代码示例

package com.polaris.designpattern.list3.behavioral.pattern06.mediator.classicdemo;import java.util.ArrayList;
import java.util.List;//中介者接口
interface Mediator {void register(Colleague colleague);void relay(Colleague source, String message);
}//具体中介者实现
class ConcreteMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void register(Colleague colleague) {colleagues.add(colleague);}@Overridepublic void relay(Colleague source, String message) {for (Colleague otherColleague : colleagues) {if (!otherColleague.equals(source)) {otherColleague.receive(message);}}}
}//同事接口
interface Colleague {void registerWith(Mediator mediator);void receive(String message);void send(String message);
}//具体同事实现
class ColleagueA implements Colleague {private Mediator mediator;public ColleagueA(Mediator mediator) {this.mediator = mediator;this.mediator.register(this); // 注册到中介者  }@Overridepublic void registerWith(Mediator mediator) {// 已在构造函数中注册,这里无需实现  }@Overridepublic void receive(String message) {System.out.println("ColleagueA received: " + message);}@Overridepublic void send(String message) {mediator.relay(this, message); // 委托给中介者发送消息  }
}// 同事B的实现与A类似
class ColleagueB implements Colleague {private Mediator mediator;public ColleagueB(Mediator mediator) {this.mediator = mediator;this.mediator.register(this); // 注册到中介者  }@Overridepublic void registerWith(Mediator mediator) {// 已在构造函数中注册,这里无需实现  }@Overridepublic void receive(String message) {System.out.println("ColleagueB received: " + message);}@Overridepublic void send(String message) {mediator.relay(this, message); // 委托给中介者发送消息  }
}//客户端代码
public class Client {public static void main(String[] args) {// 创建中介者  Mediator mediator = new ConcreteMediator();// 创建并注册同事对象  Colleague colleagueA = new ColleagueA(mediator);Colleague colleagueB = new ColleagueB(mediator); // 假设ColleagueB是另一个同事实现  // 同事A发送消息  colleagueA.send("Hello, everyone from ColleagueA!");// 同事B也可以发送消息(如果需要)  colleagueB.send("Hello, everyone from ColleagueB!");}
}  /* Output:
ColleagueB received: Hello, everyone from ColleagueA!
ColleagueA received: Hello, everyone from ColleagueB!
*///~

在这个例子中,ConcreteMediator 是具体的中介者类,它负责维护同事对象的列表,并协调它们之间的通信。ColleagueAColleagueB 是具体的同事类,它们通过中介者来发送和接收消息。在客户端代码中,我们创建了中介者和两个同事对象,并将它们注册到中介者中。然后,我们让 ColleagueA 发送一条消息,这条消息将通过中介者转发给所有其他同事(在这个例子中是 ColleagueB)。

中介者模式的应用

中介者模式是一种行为型设计模式,它允许多个对象之间通过一个中介者对象进行通信和协作。这种设计模式通常用于处理多个对象之间的复杂交互关系,以简化系统结构并提高可维护性。

在现实生活中,我们可以将机场的塔台视为一个中介者模式的例子。塔台作为中介者,负责协调不同飞机(对象)之间的起飞和降落,飞机之间无需直接相互通信,而是通过塔台进行交流。

优点

  1. 降低系统复杂性:通过将对象间的交互逻辑集中到一个中介者对象中,降低了对象间的直接耦合度,从而简化了系统结构。例如,在聊天室场景中,如果有8个人需要相互通信,使用中介者模式后,每个人只需要与中介者(聊天室)进行交互,而不是与其他7个人分别交互,大大降低了交互的复杂性。
  2. 提高可扩展性:当系统需要添加新的交互行为时,只需要修改或扩展中介者对象,而无需修改其他对象,从而提高了系统的可扩展性。
  3. 促进松散耦合:由于对象之间不再直接相互依赖,而是通过中介者进行交互,因此对象之间的耦合度大大降低,使得系统更加易于理解和维护。

缺点

  1. 中介者对象可能变得复杂:随着系统中对象数量的增加,中介者对象可能需要处理更多的交互逻辑,这可能导致中介者对象变得庞大而复杂,难以维护。
  2. 过度依赖中介者:由于所有对象都通过中介者进行交互,因此如果中介者出现故障或性能瓶颈,整个系统可能会受到影响。

使用场景

  1. 对象间存在复杂的引用关系:当系统中多个对象之间存在复杂的引用关系,导致系统结构混乱、难以理解时,可以使用中介者模式来简化这些关系。
  2. 需要集中控制交互行为:当一组对象之间的交互行为需要进行集中控制时,可以使用中介者模式来维护和管理这些交互行为。
  3. 多人协作场景:例如多人聊天室、多人游戏等场景,其中每个人都需要与其他人进行交互,使用中介者模式可以简化这些交互过程。

---

👈️上一篇:迭代器模式    |   下一篇:观察者模式👉️

设计模式-专栏👈️

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

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

相关文章

经验分享:使用Python3删除ansible主机known_hosts文件中已下线主机的公钥信息

使用Python3删除ansible主机known_hosts中已下线主机的公钥信息。 简介代码部分调用方法结果验证清理前清理后 简介 在使用ansible工具批量管理主机时&#xff0c;通常会让ansible主机与被控主机之间实现免密登录&#xff0c;从而方便工作的开展。值得注意的是&#xff0c;当被…

C语言小例程20/100

题目&#xff1a;一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。例如61&#xff0b;2&#xff0b;3.编程找出1000以内的所有完数。 #include<stdio.h> #define N 1000 int main() {int i,j,k,n,sum;int a[256];for(i2;i<N;i){suma[0]1;k…

工业网关在智能制造中的具体应用和效果-天拓四方

随着工业4.0时代的到来&#xff0c;智能制造正逐渐成为工业领域的发展趋势。作为连接物理世界与数字世界的桥梁&#xff0c;工业网关在智能制造中发挥着至关重要的作用。本案例将详细阐述工业网关在某一制造企业中的具体应用&#xff0c;展示其如何助力企业实现数字化转型&…

汽车IVI中控开发入门及进阶(二十八):视频SERDES芯片

前言: SerDes不是很常见,SerDes是将Ser和Des两种产品组合在一起的名称。Ser是Serializer或“并串转换器”的缩写,Des是Deserializer或“串并转换器”的简写。 Serdes是不是必须的?上一节介绍了camera,上上节也研究了video decoder,那么带摄像头的应用应该具体选哪个方案…

JS常用的几种函数

在JavaScript中&#xff0c;有很多常用的函数和内置对象方法。以下是一些最常见的JavaScript函数和它们的简要描述&#xff1a; console.log() 用于在浏览器的控制台或Node.js的命令行界面中打印消息。typeof() 返回一个表示变量或表达式的类型的字符串。parseInt() 和 parseF…

【安卓逆向】adb root adbd cannot run as root in production builds

尝试了很多方法不行, 最终在这篇贴纸看到这段代码 su -c "resetprop ro.debuggable 1";su -c "resetprop service.adb.root 1";su -c "magiskpolicy --live allow adbd adbd process setcurrent";su -c "magiskpolicy --live allow adbd su…

固态u盘长期不用会丢数据吗?u盘数据丢失怎么恢复需要多久

在数字化时代&#xff0c;U盘作为便携存储设备&#xff0c;广泛应用于我们的日常生活和工作中。然而&#xff0c;关于固态U盘长期不使用是否会导致数据丢失的问题&#xff0c;以及数据丢失后如何恢复和所需的时间&#xff0c;常常让人感到困惑。本文将针对这些问题进行深入探讨…

leetcode14 最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 1&#xff1a; 输入&#xff1a;strs ["flower","flow","flight"] 输出&#xff1a;"fl"示例 2&#xff1a; 输…

Java—文件拷贝

将指定的文件或目录拷贝到指定目录夹下 import java.io.*; import java.util.Scanner;/*** 实现一个文件拷贝*/ public class FileCopy {public static void main(String[] args) {Scanner scanner new Scanner(System.in);System.out.println("请输入要拷贝的源文件路径…

申请国外访问学者面签技巧有哪些?

申请国外访问学者面签是一项重要的步骤&#xff0c;关系到能否成功获得访问学者身份。以下是一些实用的面签技巧&#xff0c;帮助您顺利通过面试。 1.充分准备材料 成功的面签始于准备充分的材料。确保您的申请材料齐全&#xff0c;包括&#xff1a; 个人简历&#xff1a;突出…

3D 图片悬停效果

3D 图片悬停效果 效果展示 CSS 知识点 background 属性的综合运用transform 属性的综合运用 页面整体布局 <div class"box"><span style"--i: 0"></span><span style"--i: 1"></span><span style"--i…

python-基础篇-函数-是什么

文章目录 定义一&#xff1a;如果在开发程序时&#xff0c;需要某块代码多次执行。为了提高编写的效率以及更好的维护代码&#xff0c;需要把具有独立功能的代码块组织为一个小模块&#xff0c;这就是函数。定义一&#xff1a;我们把一些数据喂给函数&#xff0c;让他内部消化&…

MATLAB入门教程

MATLAB入门教程可以按照以下结构进行清晰地分点表示和归纳&#xff1a; 一、MATLAB概述 定义&#xff1a;MATLAB&#xff08;Matrix Laboratory&#xff09;是由MathWorks公司开发的一种用于数值计算、可视化以及编程的高级语言环境和交互式系统。特点&#xff1a;简单易学、…

【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 文件对话框QFileDialog 文章编号&#xff1a;Q…

前端如何接收SSE流式数据传输(大模型网站常用)

使用fetchEventSource 参考&#xff1a;https://blog.csdn.net/qq_43750656/article/details/1315911984 https://zhuanlan.zhihu.com/p/686618062 首先安装&#xff1a; npm install --save microsoft/fetch-event-source我参考各个资料写的函数&#xff1a; // 流式传输处…

JEnv-for-Windows 2 java版本工具的安装使用踩坑

0.环境 windows11pro 1.工具下载 GitHub - Mu-L/JEnv-for-Windows: Change your current Java version with one line or JEnv-for-Windows:Change your current Java version with one line - GitCode 2.执行jenv 初始化 2.1 问题&#xff1a;PowerShell 未对文件\XXX.…

Al智能图像处理APP,安卓手机专用一键优化工具资源合集下载

### 标题&#xff1a;Al智能图像处理APP&#xff0c;安卓手机专用一键优化工具资源合集下载 随着科技的进步&#xff0c;图像处理技术也在不断提升。为了满足用户对图像处理日益增长的需求&#xff0c;我们隆重推出了一款功能强大的图像处理工具——Al智能图像处理APP。这款安…

二、OSI七层模型和TCP,IP模型基本概念

OSI七层模型&#xff1a;&#xff08;举例是解释微信数据发送的流程&#xff09; 应用层:从应用程序的窗口接受信息 表示层&#xff1a;将接受的数据转换/加密 会话层&#xff1a;在转换后的数据中加上会话信息&#xff0c;会话信息决定会话窗口&#xff08;哪个群聊&#x…

搭建知识付费APP平台教学:在线教育系统源码详解

如何搭建一个高效的知识付费APP平台呢&#xff1f;今天&#xff0c;笔者将详细解析在线教育系统的源码&#xff0c;帮助您快速搭建自己的知识付费APP平台。 一、平台的核心功能 一个完整的知识付费APP平台通常需要具备以下核心功能&#xff1a; 用户管理 内容管理 支付 课…

业务动态校验框架应用实现

目录 一、业务背景 二、配置内容展示 三、商品动态配置内容展示 &#xff08;一&#xff09;商品spu校验信息数据 &#xff08;二&#xff09;商品sku校验信息数据 &#xff08;三&#xff09;组包商品校验信息数据 &#xff08;四&#xff09;商品数据校验数据持有者 &…