Spring框架之中介者模式 (Mediator Pattern)

中介者模式(Mediator Pattern)详解

中介者模式(Mediator Pattern)是一种行为型设计模式,旨在通过引入一个中介者对象来协调各个对象之间的交互,从而避免它们之间直接相互通信。中介者模式的核心思想是将对象之间的复杂相互依赖关系转化为与中介者的交互,通过中介者来控制对象间的通信,这样能够减少对象之间的耦合度,提高系统的可维护性和扩展性。

1. 中介者模式的定义

1.1 什么是中介者模式?

中介者模式是一种设计模式,用来定义一个对象,它封装一系列的对象交互。中介者使得多个对象之间的通信不再直接发生,而是通过中介者对象来进行。这样,各个对象不再直接依赖于其他对象,而是依赖于中介者,从而减少了系统的复杂度并提高了可维护性。

1.2 中介者模式的关键思想
  • 降低类之间的耦合度:通过将对象间的交互交给中介者来处理,减少了类之间的直接依赖关系。
  • 集中管理对象之间的交互:中介者通过管理和控制对象间的消息传递和操作,避免了多方通信带来的复杂性。
  • 增加可扩展性:新增的功能和交互可以通过扩展中介者来实现,不需要修改已有对象的实现。

2. 中介者模式的结构

中介者模式通常由以下几个角色组成:

  1. Mediator(中介者接口):定义中介者的接口,用来通过 notify 方法协助对象之间的交互。中介者通过调用对象的方法来协调对象间的通信。
  2. ConcreteMediator(具体中介者类):实现中介者接口,负责协调各个同事对象之间的交互。
  3. Colleague(同事类):每个同事类通过中介者与其他同事类进行交互。每个同事对象知道中介者对象,但是不直接与其他同事对象交互。
  4. ConcreteColleague(具体同事类):继承自同事类,具体实现同事对象的行为。
类图
      +-----------------------+|      Mediator         |+-----------------------+| +notify()             |+-----------------------+^|+-----------------------+| ConcreteMediator      |+-----------------------+| +notify()             |+-----------------------+/        |       \/         |        \
+--------------+  +--------------+  +--------------+
| Colleague A  |  | Colleague B  |  | Colleague C  |
+--------------+  +--------------+  +--------------+
| +send()      |  | +send()      |  | +send()      |
| +receive()   |  | +receive()   |  | +receive()   |
+--------------+  +--------------+  +--------------+

3. 中介者模式的实现

为了更好地理解中介者模式,我们通过一个简单的聊天室示例来实现中介者模式。在这个聊天室中,每个用户都可以发送消息,而消息的发送和接收通过中介者(即聊天室)来协调。用户之间不能直接通信,所有消息的交换通过聊天室(中介者)来处理。

3.1 Java 示例代码
// 1. Mediator 接口:中介者的接口,声明通知方法
interface Mediator {void send(String message, Colleague colleague);
}// 2. Colleague 类:同事类,定义所有同事类的共同行为
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public abstract void receive(String message);
}// 3. ConcreteColleague 类 - User A
class UserA extends Colleague {public UserA(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("User A received: " + message);}public void send(String message) {System.out.println("User A sends: " + message);mediator.send(message, this);}
}// 4. ConcreteColleague 类 - User B
class UserB extends Colleague {public UserB(Mediator mediator) {super(mediator);}@Overridepublic void receive(String message) {System.out.println("User B received: " + message);}public void send(String message) {System.out.println("User B sends: " + message);mediator.send(message, this);}
}// 5. ConcreteMediator 类 - ChatRoom
class ChatRoom implements Mediator {private UserA userA;private UserB userB;public void setUserA(UserA userA) {this.userA = userA;}public void setUserB(UserB userB) {this.userB = userB;}@Overridepublic void send(String message, Colleague colleague) {if (colleague == userA) {userB.receive(message);} else if (colleague == userB) {userA.receive(message);}}
}// 6. 客户端代码
public class MediatorPatternDemo {public static void main(String[] args) {ChatRoom chatRoom = new ChatRoom();UserA userA = new UserA(chatRoom);UserB userB = new UserB(chatRoom);chatRoom.setUserA(userA);chatRoom.setUserB(userB);userA.send("Hello from User A!");userB.send("Hello from User B!");}
}

输出结果

User A sends: Hello from User A!
User B received: Hello from User A!
User B sends: Hello from User B!
User A received: Hello from User B!

4. 中介者模式的应用场景

中介者模式适用于以下场景:

  1. 对象之间有复杂的交互关系:当多个对象之间存在相互依赖的关系时,使用中介者模式可以简化系统的设计和维护,避免过多的相互依赖。
  2. 多个对象之间需要进行通信,但不希望相互之间过于紧密耦合:通过中介者对象来管理和协调各个对象的交互,减少对象之间的依赖关系。
  3. 需要集中管理对象之间的通信:中介者模式可以将多方通信集中管理,特别适合于复杂的业务逻辑场景。
  4. 系统中有多个对象协作完成某一任务:如果系统中的多个对象需要合作完成某个任务,中介者模式可以帮助协调它们之间的交互。

5. 中介者模式的优缺点

5.1 优点
  • 减少类之间的耦合:通过中介者对象来管理类之间的通信,避免了多个类之间的直接交互,降低了耦合度。
  • 集中管理:所有的交互逻辑都被封装在中介者类中,容易集中管理和修改。
  • 提高可维护性:当系统需要修改某个交互流程时,只需要修改中介者,而不需要改动每个具体的同事类。
  • 易于扩展:新增同事类时,只需要让它实现 Colleague 接口,并将其加入到中介者中即可,不会影响已有的代码。
5.2 缺点
  • 增加系统复杂度:中介者模式引入了一个中介者对象,可能导致系统设计更加复杂,尤其是在有多个同事对象需要交互时。
  • 可能过于集中:当中介者对象变得非常复杂时,它将变成一个“胖中介者”,其中包含了大量的业务逻辑,可能导致维护困难。

6. 中介者模式的实际应用

中介者模式在实际开发中有许多应用,特别是在需要对象间协作但又不希望它们之间过于紧密耦合的场景。以下是一些常见的应用场景:

  1. 聊天室系统:如上例所示,聊天室中的每个用户(同事类)通过中介者(聊天室)来进行消息的发送和接收。中介者负责协调消息的转发,避免了直接的点对点通信。
  2. GUI框架:在复杂的用户界面中,多个控件(按钮、输入框等)之间的交互可以通过中介者来管理。例如,在一些MVC框架中,控制器可以作为中介者,协调视图和模型的交互。
  3. 航空控制系统:在航空控制系统中,飞机、地面控制中心等多个对象之间需要进行协调和通信。使用中介者模式,可以避免它们之间的直接通信,提高系统的可

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

DBeaver中PostgreSQL数据库显示不全的解决方法

本文介绍在DBeaver中,连接PostgreSQL后,数据库显示不全的解决方法。 最近,在DBeaver中连接了本地的PostgreSQL数据库。但是连接后打开这个数据库时发现,其所显示的Databases不全。如下图所示,Databases只显示了一个pos…

ElasticSearch学习笔记二:使用Java客户端

一、前言 在上一篇文章中&#xff0c;我们对ES有了最基本的认识&#xff0c;本着实用为主的原则&#xff0c;我们先不学很深的东西&#xff0c;今天打算先学习一下ES的Java客户端如何使用。 二、创建项目 1、普通Maven项目 1、创建一个Maven项目 2、Pom文件 <dependenc…

MySQL8 安装教程

一、从官网下载mysql-8.0.18-winx64.zip安装文件&#xff08; 从 https://dev.mysql.com/downloads/file/?id484900 下载zip版本安装包 mysql-8.0.18-winx64.zip 解压到本地磁盘中&#xff0c;例如解压到&#xff1a;D盘根目录&#xff0c;并改名为MySQL mysql-8.0.34-winx6…

如何将LiDAR坐标系下的3D点投影到相机2D图像上

将激光雷达点云投影到相机图像上做数据层的前融合&#xff0c;或者把激光雷达坐标系下标注的物体点云的3d bbox投影到相机图像上画出来&#xff0c;都需要做点云3D点坐标到图像像素坐标的转换计算&#xff0c;也就是LiDAR 3D坐标转像素坐标。 看了网上一些文章都存在有错误或者…

【Pikachu】XML外部实体注入实战

若天下不定&#xff0c;吾往&#xff1b;若世道不平&#xff0c;不回&#xff01; 1.XXE漏洞实战 首先写入一个合法的xml文档 <?xml version "1.0"?> <!DOCTYPE gfzq [<!ENTITY gfzq "gfzq"> ]> <name>&gfzq;</name&…

游戏引擎学习第13天

视频参考:https://www.bilibili.com/video/BV1QQUaYMEEz/ 改代码的地方尽量一张图说清楚吧,懒得浪费时间 game.h #pragma once #include <cmath> #include <cstdint> #include <malloc.h>#define internal static // 用于定义内翻译单元内部函数 #…

(一)Ubuntu20.04服务器端部署Stable-Diffusion-webui AI绘画环境

一、说明 cup型号&#xff1a; Intel(R) Celeron(R) CPU G1610 2.60GHz 内存大小&#xff1a; 7.5Gi 356Mi 4.6Gi 1.0Mi 2.6Gi 6.8Gi Swap: 4.0Gi 0B 4.0Gi 显卡型号&#xff1a;NVIDIA P104-100 注意&#xff1a…

Python Tornado框架教程:高性能Web框架的全面解析

Python Tornado框架教程&#xff1a;高性能Web框架的全面解析 引言 在现代Web开发中&#xff0c;选择合适的框架至关重要。Python的Tornado框架因其高性能和非阻塞I/O特性而备受青睐。它特别适合处理大量并发连接的应用&#xff0c;比如聊天应用、实时数据处理和WebSocket服务…

ubuntu20.04安装anaconda

在anaconda的官网&#xff08;Anaconda | The Operating System for AI&#xff09;或者清华镜像源网站&#xff08;Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff09;中下载对应的anaconda版本 可以在网页直接下载或者通过命…

平衡二叉搜索树之 红黑 树的模拟实现【C++】

文章目录 红黑树的简单介绍定义红黑树的特性红黑树的应用 全部的实现代码放在了文章末尾准备工作包含头文件类的成员变量和红黑树节点的定义 构造函数和拷贝构造swap和赋值运算符重载析构函数findinsert【重要】第一步&#xff1a;按照二叉搜索树的方式插入新节点第二步&#x…

【设计模式】行为型模式(四):备忘录模式、中介者模式

行为型模式&#xff08;四&#xff09;&#xff1a;备忘录模式、中介者模式 7.备忘录模式&#xff08;Memento&#xff09;7.1 通俗易懂的解释7.2 具体步骤7.3 代码示例7.3.1 定义发起人7.3.2 定义备忘录7.3.3 定义管理者7.3.4 客户端7.3.5 输出 7.4 总结 8.中介者模式&#xf…

Thinkpad E15 在linux下升级 bios

安装xubuntu 24.04后&#xff0c;发现键盘的Fn按键全都无法使用&#xff0c;在Windows环境下是正常的&#xff0c;按说是驱动的问题&#xff0c;网上也有说可以通过升级BIOS解决&#xff0c;所以打算升级看看&#xff0c;升级有风险。 参考&#xff1a; https://blog.stigok.c…

Java学习Day61:薄纱王灵官!(Nginx review)

1.Nginx是什么 Nginx是一款轻量级、高性能&#xff0c;并发性好的HTTP和反向代理服务器 2.功能 2.1反向代理 正向代理是指客户端向代理服务器发送请求&#xff0c;代理服务器代表客户端去访问目标服务器。简单来说&#xff0c;正向代理是客户端的代理&#xff0c;客户端通过…

MATLAB用到的矩阵基础知识(矩阵的乘和矩阵的逆)

1. 矩阵乘法 方法: 设第一个矩阵为 A A A,第二个矩阵为 B B B,则 A A A的第一行乘 B B B的第一列,先想乘再相加,作为目标矩阵的一个元素。 前提条件: 所以我们可以看到矩阵相乘的前提条件:第一个矩阵的列数等于第二个矩阵的行数。否则,我们就无法进行行和列的相乘。 最…

Oracle OCP认证考试考点详解082系列22

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 105. 第105题&#xff1a; 题目 解析及答案&#xff1a; 题目翻译&#xff1a; 关于Oracle数据库中的事务请选择两个正确的陈述&#xf…

【ict基础软件赛道】真题-50%openGauss

题目取自赛前测试链接 OpenGauss安装前使用哪个工具检查环境是否符合安装哪个功能不是gs_guc工具提供的opengauss数据库逻辑复制的特点描述正确的是opengauss的全密态数据库等值查询能力描述正确的是哪个不属于ssh客户端工具opengauss三权分立说法正确的是opengauss wdr snapsh…

MDK5(Keil5)工具设置及技巧

设置&#xff1a; 1点击扳手&#xff08;设置&#xff09; 2文字设置为GB2312简体 3勾选显示空格 4按一下TAB键移动4个空格 修改keil中数字大小及颜色&#xff08;增加对比&#xff09; 勾选全部 1提示结构体 2提示函数参数 3打上几个英文符号后开始提示 4TAB作为填充字符 5打开…

4G模组Air780E对json数据处理的基本方法~

4G模组Air780E在数据传输和处理中扮演着越来越重要的角色。在实际应用中&#xff0c;JSON作为一种轻量级的数据交换格式&#xff0c;被广泛应用于网络数据传输和存储。本文将详细介绍4G模组Air780E对JSON数据处理的基本方法&#xff0c;以帮助开发者更好地利用这一模组进行数据…

学习使用LVGL,依赖官方网址

LVGL Basics — LVGL documentation LVGL基础知识 LVGL是一个开源的图形库&#xff0c;提供创建嵌入式GUI的一切 LVGL数据流 您为每个物理显示面板 创建一个显示器 (lv_display) &#xff0c;在其上创建屏幕小部件&#xff0c;将小部件添加到这些屏幕上。要处理触摸、鼠标、…