中介者模式:优雅解耦的利器
在软件设计中,随着系统功能的不断扩展,对象之间的依赖关系往往会变得错综复杂,导致系统难以维护和扩展。为了降低对象之间的耦合度,提高系统的可维护性和可扩展性,设计模式应运而生。中介者模式(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 (最好只看到一个连上的设置…...
三伍微Wi-Fi射频芯片实测:如何用GSR2303替代SKY85303提升路由器信号(附兼容清单)
三伍微GSR2303射频芯片实战指南:从参数对比到焊接优化的完整替代方案 在路由器硬件迭代和成本优化的双重驱动下,国产射频前端模块(FEM)正逐步打破国际大厂的垄断格局。三伍微电子推出的GSR2303作为SKY85303的兼容替代方案,不仅实现了引脚对引…...
高效运维新选择:Shell 脚本自动化生成可视化 Linux 系统健康报告
1. 为什么需要自动化系统健康报告? 每次登录服务器手动检查系统状态的日子该结束了。想象一下,你管理着几十台Linux服务器,每天要重复执行相同的命令查看CPU、内存、磁盘使用情况,这种重复劳动不仅效率低下,还容易遗漏…...
手把手教你用雷池WAF打造企业级错误页面:自定义配色+品牌元素植入指南
企业级WAF错误页面定制实战:从品牌色适配到动效优化 当用户访问企业网站遭遇拦截时,呈现给他们的错误页面往往成为品牌形象的"最后防线"。一套设计粗糙的默认拦截界面,不仅可能让用户产生困惑,更会损害企业精心构建的专…...
无需训练数据!RexUniNLU零样本抽取实战,效果超预期
无需训练数据!RexUniNLU零样本抽取实战,效果超预期 1. 零样本理解:NLP领域的新范式 在传统自然语言处理项目中,我们常常陷入一个困境:为了从文本中抽取特定信息,必须先收集大量标注数据,然后训…...
HOW - 撰写前端技术方案
文章目录 一份完整前端技术方案结构 项目背景 & 目标 技术选型 架构设计(核心) 模块划分 数据流设计(很重要) 接口设计(API 对接) 状态管理方案 性能优化方案 安全方案 工程化方案 测试方案 部署 & CI/CD 风险 & 预案 总结 加分 图示或表格 功能到工程的考量…...
智驾端到端模型Flow Matching与Diffusion选型及机器人场景差异解析
文章目录一、核心问题开篇:智驾端到端模型为何极少用Flow Matching?1.1 Flow Matching核心原理与智驾适配痛点(1)车载实时性与算力硬约束(核心痛点)(2)安全硬约束难以嵌入࿰…...
深入Linux V4L2主从设备通信机制:从Camera Host控制器到Sensor的完整数据流分析
深入Linux V4L2主从设备通信机制:从Camera Host控制器到Sensor的完整数据流分析 1. V4L2子系统架构与核心设计理念 在嵌入式视觉系统中,Camera Host控制器与图像传感器(Sensor)的协同工作构成了视频采集的基础链路。Linux V4L2(Video for Linux 2)子系统…...
VulApps核心功能解析:一站式漏洞环境搭建神器,安全研究者必备工具
VulApps核心功能解析:一站式漏洞环境搭建神器,安全研究者必备工具 【免费下载链接】VulApps 快速搭建各种漏洞环境(Various vulnerability environment) 项目地址: https://gitcode.com/gh_mirrors/vu/VulApps VulApps是一款专为安全研究者打造的…...
人脸识别OOD模型中小企业落地:低成本GPU算力下的高鲁棒识别方案
人脸识别OOD模型中小企业落地:低成本GPU算力下的高鲁棒识别方案 1. 为什么中小企业需要高质量人脸识别方案 对于中小企业来说,部署人脸识别系统往往面临两难选择:要么选择价格昂贵的高端方案,要么使用效果不佳的廉价方案。传统方…...
LeetCode 138:随机链表复制(Copy List with Random Pointer)——思路解析 + 易错点总结
目录 一、题目简介 二、思考过程 三、O(1) 空间解法(核心) Step1 插入复制节点 Step2 复制 random 指针 Step3 拆分链表 四、完整代码(C语言) 五、学习过程中遇到的关键问题 六、实现过程中出现的错误总结 七、面试官可…...
