中介者模式:优雅解耦的利器
在软件设计中,随着系统功能的不断扩展,对象之间的依赖关系往往会变得错综复杂,导致系统难以维护和扩展。为了降低对象之间的耦合度,提高系统的可维护性和可扩展性,设计模式应运而生。中介者模式(Mediator Pattern)就是其中一种常见且实用的设计模式。
一、中介者模式概述
中介者模式定义了一个中介对象来封装一系列对象之间的交互,使得这些对象不需要显式地相互引用,从而降低了系统的耦合性。中介者模式属于行为设计模式,它提供了一种将多个对象之间的复杂交互简化为中介者与对象之间一对多交互的机制。
二、中介者模式的使用条件
中介者模式通常在以下情况下使用:
-
当多个对象之间存在复杂的交互关系时,通过引入中介者来简化这些交互,使得系统更加清晰和易于理解。
-
当对象之间的交互导致系统难以维护和扩展时,使用中介者模式可以降低系统的耦合度,提高系统的可维护性和可扩展性。
-
当需要集中管理多个对象之间的交互逻辑时,中介者模式可以将这些逻辑封装在中介者对象中,便于统一管理和维护。
三、中介者模式的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)…...

网易云首页单页面html+css
网页设计与网站建设作业htmlcss 预览 源码查看https://hpc.baicaitang.cn/2083.html...
acwing算法提高之图论--最小生成树的典型应用
目录 1 介绍2 训练 1 介绍 本专题用来记录使用prim算法或kruskal算法求解的题目。 2 训练 题目1:1140最短网络 C代码如下, #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数组(dp table)以及下标的含义1.2.2、确定递推公式1.2.3、 dp数组如何初始化1.2.4、确定遍历顺序1.2.5、计算并返回最终结果 二、 01背包之一维数组…...

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

CSS面试题---基础
1、css选择器及优先级 选择器优先级:内联样式>id选择器>类选择器、属性选择器、伪类选择器>标签选择器、微元素选择器 注意: !important优先级最高; 如果优先级相同,则最后出现的样式生效; 继承得到的样式优先…...

OpenHarmony实战开发-分布式数据管理
介绍 本示例展示了在eTS中分布式数据管理的使用,包括KVManager对象实例的创建和KVStore数据流转的使用。 通过设备管理接口ohos.distributedDeviceManager ,实现设备之间的kvStore对象的数据传输交互,该对象拥有以下能力详见 ;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.设置网络 视频地址: 05-Rab…...

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

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

RVM安装ruby笔记
环境 硬件:Macbook Pro 系统:macOS 14.1 安装公钥 通过gpg安装公钥失败,报错如下: 换了几个公钥地址(hkp://subkeys.pgp.net,hkp://keys.gnupg.net,hkp://pgp.mit.edu),…...
电力系统负荷预测方法
电力系统负荷是什么? 所谓的电力负荷预测是指以电力负荷变化以及外界因素变化为基础,以特定的数学方法或者建立数学模型的方式为手段,通过对电力负荷历史数据进行分析,对电力系统的需求做出估计以及研究相关因素对电力负荷的影响…...

electron打包桌面版.exe之vue项目踩坑(vue3+electron 解决打包后首页打开空白,打包后路由不跳转及请求不到后端数据等问题)
vue项目https://www.qingplus.cn/components-web/index打包桌面版问题集合 一、静态资源加载问题 npm run electron_dev桌面版运行后页面空白,内容未加载。 填坑: 打包配置要用相对路径 vite.config.ts文件中的base要改成./,之前加了项目…...
MySQL学习笔记(持续更行ing)
级别: 1. 了解,面试概率10% 2. 掌握,面试概率50% 3. 重点,面试概率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模型和文件 参考:https://huggingface.co/welcome 1 注册hugging face 官网注册,并获取token【https://huggingface.co/settings/tokens】,用于登录 2 安装 2.1 安装lfs https://stackoverflow.com/qu…...
Rust 开发的高性能 HTTP 请求工具
一、简述 在现在的软件开发领域,HTTP请求的快速验证变得越来越重要。特别是对于后端开发人员和测试工程师来说,能够快速创建、执行并验证HTTP请求对于提升开发效率至关重要。近期有一个名为Hurl的开源项目,它被设计来高效执行HTTP请求&#…...
Android Studio 通过 WIFI 调试手机 app
操作流程 首先第一步,PC 和手机都需要连在同一个局域网 WIFI。 第二步,手机 USB 连上 PC,确保能查看到通过 USB 连上的设备: >>adb devices List of devices attached CSXasjdhwjqwjhqdh device (最好只看到一个连上的设置…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
服务器--宝塔命令
一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行! sudo su - 1. CentOS 系统: yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...