当前位置: 首页 > news >正文

中介者模式:优雅解耦的利器

在软件设计中,随着系统功能的不断扩展,对象之间的依赖关系往往会变得错综复杂,导致系统难以维护和扩展。为了降低对象之间的耦合度,提高系统的可维护性和可扩展性,设计模式应运而生。中介者模式(Mediator Pattern)就是其中一种常见且实用的设计模式。

一、中介者模式概述

中介者模式定义了一个中介对象来封装一系列对象之间的交互,使得这些对象不需要显式地相互引用,从而降低了系统的耦合性。中介者模式属于行为设计模式,它提供了一种将多个对象之间的复杂交互简化为中介者与对象之间一对多交互的机制。

二、中介者模式的使用条件

中介者模式通常在以下情况下使用:

  1. 当多个对象之间存在复杂的交互关系时,通过引入中介者来简化这些交互,使得系统更加清晰和易于理解。

  2. 当对象之间的交互导致系统难以维护和扩展时,使用中介者模式可以降低系统的耦合度,提高系统的可维护性和可扩展性。

  3. 当需要集中管理多个对象之间的交互逻辑时,中介者模式可以将这些逻辑封装在中介者对象中,便于统一管理和维护。

三、中介者模式的Java实现

下面通过一个简单的例子来说明中介者模式的Java实现。假设有一个聊天室的场景,用户之间可以发送消息进行交流,我们可以使用中介者模式来简化用户之间的交互。

// 抽象中介者接口  
interface Mediator {  void sendMessage(String from, String to, String message);  
}  // 具体中介者实现  
class ChatRoom implements Mediator {  private User user1;  private User user2;  public ChatRoom(User user1, User user2) {  this.user1 = user1;  this.user2 = user2;  }  @Override  public void sendMessage(String from, String to, String message) {  if (from.equals(user1.getName()) && to.equals(user2.getName())) {  user2.receiveMessage(message);  } else if (from.equals(user2.getName()) && to.equals(user1.getName())) {  user1.receiveMessage(message);  } else {  System.out.println("Invalid user or message direction!");  }  }  
}  // 抽象用户类  
abstract class User {  protected String name;  protected Mediator mediator;  public User(String name, Mediator mediator) {  this.name = name;  this.mediator = mediator;  }  public String getName() {  return name;  }  public abstract void send(String to, String message);  public abstract void receiveMessage(String message);  
}  // 具体用户实现  
class UserImpl extends User {  public UserImpl(String name, Mediator mediator) {  super(name, mediator);  }  @Override  public void send(String to, String message) {  mediator.sendMessage(getName(), to, message);  }  @Override  public void receiveMessage(String message) {  System.out.println(getName() + " received message: " + message);  }  
}

在上面的代码中,我们定义了一个Mediator接口作为中介者的抽象,其中包含一个sendMessage方法用于发送消息。ChatRoom类实现了Mediator接口,作为具体的中介者,它维护了两个用户对象,并根据发送者和接收者的信息来传递消息。User是一个抽象用户类,其中定义了发送和接收消息的方法。UserImpl是具体用户类,实现了User接口中的方法,并通过中介者来发送消息。

四、现实社会中的中介者模式

在现实生活中,中介者模式的例子比比皆是。例如,在房地产交易中,房屋中介就充当了中介者的角色,他们负责协调买家和卖家之间的沟通和交易,使得双方无需直接联系就能完成房屋的买卖。再比如,在股票交易市场中,证券交易所也扮演了中介者的角色,它提供了交易平台,让买家和卖家可以在此进行股票的买卖交易。

五、开源项目中的中介者模式

中介者模式在开源项目中也得到了广泛的应用。以著名的MVC框架Spring MVC为例,其中的DispatcherServlet就充当了中介者的角色。它负责接收用户的请求,并根据请求的信息将请求分发给相应的控制器进行处理。这样,控制器之间就不需要相互引用和依赖,降低了系统的耦合度。

六、行业应用与未来发展

中介者模式在各行各业都有广泛的应用,尤其是在需要处理复杂交互和降低系统耦合度的场景中。例如,在金融行业,交易系统、支付系统等都需要处理大量的交互逻辑,中介者模式可以帮助简化这些交互并提高系统的稳定性。

随着技术的不断发展和软件设计模式的演变,中介者模式也可能衍生出新的变种或与其他模式结合使用,以适应更加复杂和多样化的应用场景。例如,在微服务架构中,服务之间的通信和协调变得更加重要,中介者模式可以与服务发现、负载均衡等技术相结合,提供更加高效和灵活的服务调用机制。

七、总结

中介者模式是一种强大的设计模式,它通过将多个对象之间的复杂交互简化为中介者与对象之间的一对多交互,降低了系统的耦合度,提高了系统的可维护性和可扩展性。无论是在传统的软件开发中还是在新兴的微服务架构中,中介者模式都发挥着重要的作用。随着技术的不断进步和应用场景的不断拓展,我们有理由相信中介者模式将会在未来继续发挥其独特的价值。

相关文章:

中介者模式:优雅解耦的利器

在软件设计中,随着系统功能的不断扩展,对象之间的依赖关系往往会变得错综复杂,导致系统难以维护和扩展。为了降低对象之间的耦合度,提高系统的可维护性和可扩展性,设计模式应运而生。中介者模式(Mediator P…...

Ubuntu20.04安装MatlabR2018a

一、安装包 安装包下载链接 提取码:kve2 网上相关教程很多,此处仅作为安装软件记录,方便后续软件重装,大家按需取用。 二、安装 1. 相关文件一览 下载并解压文件后,如下图所示: 2. 挂载镜像并安装 2…...

基于SpringBoot的图书馆管理系统设计与实现

介绍 基于:java8 SpringBoot thymeleaf MySQL8.0.17 mybatis-plus maven Xadmin 实现图书馆管理系统 系统要实现如下的基本管理功能: (1)用户分为两类:管理员,一般用户。 (2&#xff09…...

网易云首页单页面html+css

网页设计与网站建设作业htmlcss 预览 源码查看https://hpc.baicaitang.cn/2083.html...

acwing算法提高之图论--最小生成树的典型应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用prim算法或kruskal算法求解的题目。 2 训练 题目1&#xff1a;1140最短网络 C代码如下&#xff0c; #include <iostream> #include <cstring>using namespace std;const int N 110, INF 0x3f3f3f3f; int g[N][N…...

springcloud基本使用二(远程调用)

创建两个springboot maven子项目 子项目名称分别为order-server和user-server 配置user-server子项目: 所需依赖: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependenc…...

代码随想录刷题day42| 01背包理论基础分割等和子集

文章目录 day41学习内容一、 01背包之二维数组解法1.1、什么是01背包1.2、动态规划五部曲1.2.1、 确定dp数组&#xff08;dp table&#xff09;以及下标的含义1.2.2、确定递推公式1.2.3、 dp数组如何初始化1.2.4、确定遍历顺序1.2.5、计算并返回最终结果 二、 01背包之一维数组…...

Python文件操作命令

文件操作 我知道你最近很累&#xff0c;是那种看不见的、身体上和精神上的疲惫感&#xff0c;但是请你一定要坚持下去。就算无人问津也好&#xff0c;技不如人也好&#xff0c;千万别让烦躁和焦虑毁了你的热情和定力。别贪心&#xff0c;我们不可能什么都有&#xff0c;也别灰心…...

CSS面试题---基础

1、css选择器及优先级 选择器优先级&#xff1a;内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意&#xff1a; !important优先级最高&#xff1b; 如果优先级相同&#xff0c;则最后出现的样式生效&#xff1b; 继承得到的样式优先…...

OpenHarmony实战开发-分布式数据管理

​介绍 本示例展示了在eTS中分布式数据管理的使用&#xff0c;包括KVManager对象实例的创建和KVStore数据流转的使用。 通过设备管理接口ohos.distributedDeviceManager &#xff0c;实现设备之间的kvStore对象的数据传输交互&#xff0c;该对象拥有以下能力详见 ;1、注册和解…...

微服务(基础篇-007-RabbitMQ部署指南)

目录 05-RabbitMQ快速入门--介绍和安装_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1LQ4y127n4?p65&vd_source60a35a11f813c6dff0b76089e5e138cc 1.单机部署 1.1.下载镜像 1.2.安装MQ 2.集群部署 2.1.集群分类 2.2.设置网络 视频地址&#xff1a; 05-Rab…...

C语言一维数组及二维数组详解

引言&#xff1a; 小伙伴们&#xff0c;我发现我正文更新的有些慢&#xff0c;但相信我&#xff0c;每一篇文章真的都很用心在写的&#xff0c;哈哈&#xff0c;在本篇博客当中我们将详细讲解一下C语言中的数组知识&#xff0c;方便大家后续的使用&#xff0c;有不会的也可以当…...

11.图像边缘检测的原理与实现

数字图像处理(19): 边缘检测算子(Roberts算子、Prewitt算子、Sobel算子 和 Laplacian算子) 数字图像处理(20): 边缘检测算子(Canny算子) 1.边缘检测介绍 1.1 边缘检测的基本原理 边缘是图像的基本特征&#xff0c;所谓的边缘就是指的图像的局部不连续性。灰度或者结构等信息的…...

RVM安装ruby笔记

环境 硬件&#xff1a;Macbook Pro 系统&#xff1a;macOS 14.1 安装公钥 通过gpg安装公钥失败&#xff0c;报错如下&#xff1a; 换了几个公钥地址&#xff08;hkp://subkeys.pgp.net&#xff0c;hkp://keys.gnupg.net&#xff0c;hkp://pgp.mit.edu&#xff09;&#xff0c;…...

电力系统负荷预测方法

电力系统负荷是什么&#xff1f; 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础&#xff0c;以特定的数学方法或者建立数学模型的方式为手段&#xff0c;通过对电力负荷历史数据进行分析&#xff0c;对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)

vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白&#xff0c;内容未加载。 填坑&#xff1a; 打包配置要用相对路径 vite.config.ts文件中的base要改成./&#xff0c;之前加了项目…...

MySQL学习笔记(持续更行ing)

级别&#xff1a; 1. 了解&#xff0c;面试概率10% 2. 掌握&#xff0c;面试概率50% 3. 重点&#xff0c;面试概率80% 目录 1. 数据库**** 1.1. 概念**** 1.2. 分类**** 1.2.1. 关系型数据库**** 1.2.1.1. SQL**** 1.2.2. 安装**** 1.2.2.1. Navicat**** 1.2.3. 非…...

服务器配置Huggingface并git clone模型和文件

服务器配置Huggingface并git clone模型和文件 参考&#xff1a;https://huggingface.co/welcome 1 注册hugging face 官网注册&#xff0c;并获取token【https://huggingface.co/settings/tokens】&#xff0c;用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...

Rust 开发的高性能 HTTP 请求工具

一、简述 在现在的软件开发领域&#xff0c;HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说&#xff0c;能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目&#xff0c;它被设计来高效执行HTTP请求&#…...

Android Studio 通过 WIFI 调试手机 app

操作流程 首先第一步&#xff0c;PC 和手机都需要连在同一个局域网 WIFI。 第二步&#xff0c;手机 USB 连上 PC&#xff0c;确保能查看到通过 USB 连上的设备&#xff1a; >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...

RabbitMQ高级笔记

视频链接&#xff1a;【黑马程序员RabbitMQ入门到实战教程】 文章目录 1.发送者的可靠性1.1.生产者重试机制1.2.生产者确认机制1.3.实现生产者确认1.3.1.开启生产者确认1.3.2.定义ReturnCallback1.3.3.定义ConfirmCallback 2.MQ的可靠性2.1.数据持久化2.1.1.交换机持久化2.1.2.…...

【Qt】QtCreator交叉编译环境配置Qt mkspec

1、问题描述 在QtCreator中配置TI AM437x的交叉编译环境后,编译时报错,错误信息如下 error: gnu/stubs-soft.h: No such file or directory2、原因分析 1)环境变量CC 搜索网络,解决方法为修改交叉编译工具目录下环境配置脚本,即执行source时的文件。 本人环境为:linux…...

点点数据K参数加密逆向分析(RPC方案跟加密算法还原)

文章目录 1. 写在前面2. 接口分析3. 断点分析4. RPC调用5. 算法还原 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长…...

考研数学|《1800》+《660》精华搭配混合用(经验分享)

肯定不行&#xff0c;考研数学哪有这么容易的&#xff01; 先说说这两本习题册&#xff0c;李永乐老师推出的新版660题&#xff0c;相较于18年前的版本&#xff0c;难度略有降低&#xff0c;更加适合初学者。因此&#xff0c;对于处于基础阶段的学习者来说&#xff0c;新版660…...

【Redis 二】Redis客户端(Jedis、SpringDataRedis、RedisTemplate)

1. Redis客户端 Jedis 以redis命令作为方法名称&#xff0c;学习成本低&#xff0c;但是Jedis实例是线程不安全的&#xff0c;多线程环境下需要基于连接池来使用&#xff08;必须为每个线程分配独立的Jedis连接&#xff09; lettuce 基于Netty实现&#xff0c;支持同步、异步和…...

Java中Filter和Interceptor的区别

概述 本文阐述Java中Filter和Interceptor的区别。 执行顺序不同 FIlter->Servlet->Interceptor->Controller 配置方式不同 FIlter在web.xml中配置 Interceptor在spring中的配置文件中、使用注解 是否依赖servlet Filter依赖servlet&#xff0c;而Interceptor不…...

记一次 pdfplumber 内存泄漏导致的服务器宕机

有一个项目需求&#xff0c;要在每天凌晨5点的时候执行一个任务&#xff0c;获取一系列的PDF文件并解析。 后端是Django框架&#xff0c;定时任务用Celery来实现的。 本地跑没什么问题&#xff0c;但是一放到服务器上跑就会宕机&#xff0c;而且是毫无征兆的宕机&#xff0c;…...

SpringBoot单元测试剖析

SpringBoot作为一种流行的Java框架&#xff0c;其单元测试的重要性不言而喻。在这篇博客中&#xff0c;我们将深入剖析SpringBoot单元测试的底层原理。 单元测试的概念 单元测试是软件开发过程中的一个重要环节&#xff0c;它是对软件中的最小可测试单元进行检查和验证。对于…...

【华为OD机试C++】计算某字符出现次数

文章目录 描述输入描述输出描述示例代码 描述 写出一个程序&#xff0c;接受一个由字母、数字和空格组成的字符串&#xff0c;和一个字符&#xff0c;然后输出输入字符串中该字符的出现次数。&#xff08;不区分大小写字母&#xff09; 数据范围&#xff1a; 1 \le n \le 1000 …...

ORA-01779 BYPASS_UJVC 11.2后废弃了

有这么个update语句 update A t set status 1 where exists (select 1 from B B where B.code A.code) 因性能问题需要修改写法。 在oracle10G这么update是没问题的&#xff1a; update( select …...

如何做网站咨询/免费b站推广网站短视频

目录&#xff1a;python学习目录 开发环境&#xff1a;vs 2019os.access(para1, para2) 用来判断para1路径有什么权限 para1&#xff1a;文件路径 para2&#xff1a;有以下四个值 os.F_OK&#xff1a;测试para1路径是否存在 os.R_OK&#xff1a;测试para1路径是否允许读 os.W_O…...

北京商地网站建设公司/微软优化大师

SimpleAdapter是ArrayList和 ListView的桥梁。这个ArrayList里边的每一项都是一个Map<String,?>类型。 ArrayList当中的每一项 Map对象都和ListView里边的每一项进行数据绑定一一对应。 SimpleAdapter的构造函数&#xff1a; SimpleAdapter(Context context, List<?…...

工作室网站建设费用价格/产品销售方案与营销策略

vue3生命周期、和hookvue3生命周期图生命钩子(与name、setup配置项同级)组合api形式写法hook位置&#xff1a;内容&#xff1a;使用:总结vue3生命周期图 生命钩子(与name、setup配置项同级) beforeCreate() {console.log("-----beforeCreate-----");},created() {con…...

大兴高端网站建设/下载百度2024最新版

效果图 image.png 提供的方法 和 属性 ref.show() // ref 主动调用显示打开ref.hide() // ref 主动调用隐藏关闭modalBoxHeight: 300, // 盒子高度modalBoxBg: #fff, // 盒子背景色hide: function () { }, // 关闭时的回调函数transparentIsClick: true // 透明区域是否可以点…...

wordpress 联系地图/百度搜索高级搜索技巧

最近博客更新的少了&#xff0c;相对而言&#xff0c;我在自己的个人公众号里还是挺活跃的&#xff0c;大家可以扫描旁边的二维码&#xff0c;或者微信搜索公众号&#xff1a;“编程一生”加关注。 在分布式的年代&#xff0c;一个应用需要部署到多台服务器上。那么要查看日志文…...

网站后台ftp替换图片怎么做/免费自助建站

方法一&#xff1a;重写TextView的onDraw方法&#xff0c;也挺直观就是不太好控制显示完图片后再显示字体所占空间的位置关系。一般假设字体是在图片上重叠的推荐这样写。时间关系&#xff0c;这个不付源代码了。方法二&#xff1a;利用TextView支持部分Html的特性。直接用api赋…...