当前位置: 首页 > 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 (最好只看到一个连上的设置…...

日记:2032-2034,当AI成了空气,我们终于活成了AI替代不了的样子

2033年6月1日晴儿童节今天老婆的绘本馆搞六一活动&#xff0c;整个社区的小朋友都来了&#xff0c;挤得满满当当的。我带着社区里几个留守儿童也过来了&#xff0c;看着孩子们围着老婆&#xff0c;听她讲故事&#xff0c;笑得前仰后合&#xff0c;心里软乎乎的。活动结束后&…...

Windows下QT5.15.2安装MQTT模块全攻略(附分支选择避坑指南)

Windows下QT5.15.2安装MQTT模块全攻略&#xff08;附分支选择避坑指南&#xff09; 在物联网开发领域&#xff0c;MQTT协议因其轻量级和高效性成为设备通信的首选方案。对于使用QT5.15.2进行跨平台开发的工程师而言&#xff0c;在Windows环境下正确配置MQTT模块往往是项目起步的…...

ESP8266 入门指南 — 从零开始烧录AT固件

1. 为什么需要烧录AT固件 第一次拿到ESP8266模块时&#xff0c;很多朋友会直接尝试用串口发送AT指令&#xff0c;结果发现模块毫无反应。这种情况我遇到过太多次了&#xff0c;根本原因在于模块没有预装AT固件。虽然部分商家会预先烧录好&#xff0c;但根据我的经验&#xff0c…...

如何让AI帮你读完100篇文献,并写出综述的核心内容?

对于每一位科研工作者而言&#xff0c;面对一个新的课题或研究方向&#xff0c;最让人望而生畏的往往不是实验本身&#xff0c;而是前期那如山般堆积的文献调研。当你需要在短时间内读完100篇甚至更多核心文献&#xff0c;并从中提炼出逻辑严密、观点独到的综述核心内容时&…...

零宽度字符隐写术全解析:从Unicode原理到实战检测工具推荐

零宽度字符隐写术全解析&#xff1a;从Unicode原理到实战检测工具推荐 在数字信息安全的隐秘角落&#xff0c;有一种几乎不可见的通信方式正在被安全研究人员和渗透测试工程师频繁使用——零宽度字符隐写术。这种技术允许我们将秘密信息嵌入普通文本中&#xff0c;肉眼无法察觉…...

当电力系统遇上MATLAB:手把手玩转SVC设计

基于MATLAB的静止无功补偿系统设计 本设计包括设计报告&#xff0c;仿真工程。 静止无功补偿系统&#xff08;Static Var Compensator&#xff0c;简称SVC&#xff09;是一种用于电力系统中动态调节无功功率的装置&#xff0c;主要由以下几个核心组件构成&#xff1a;晶闸管控制…...

VisualVM企业级部署指南:大规模Java应用监控最佳实践

VisualVM企业级部署指南&#xff1a;大规模Java应用监控最佳实践 【免费下载链接】visualvm VisualVM is an All-in-One Java Troubleshooting Tool 项目地址: https://gitcode.com/gh_mirrors/vi/visualvm VisualVM是一款功能强大的全合一Java故障排除工具&#xff0c;…...

【模型手术室】第九篇:多模态微调 —— 让模型学会“看图说话”:从像素到行业认知的飞跃

专栏进度&#xff1a;09 / 10 (微调实战专题) 如果你使用的是 LLaVA、Qwen2-VL 或 DeepSeek-VL&#xff0c;它们原生具备识别猫狗和常识图片的能力。但如果你给它一张半导体无尘车间的传感器拓扑图&#xff0c;它大概率会胡言乱语。多模态微调的目标&#xff0c;就是建立“视觉…...

Ollama安装路径优化:从C盘迁移到D盘的完整指南

1. 为什么需要迁移Ollama到D盘&#xff1f; 很多AI开发者在Windows系统上初次安装Ollama时&#xff0c;都会遇到一个头疼的问题——默认安装路径在C盘。随着模型文件的不断下载和项目积累&#xff0c;C盘空间很快就会被占满。我自己就经历过C盘爆红的尴尬&#xff0c;系统卡顿不…...

基于NativeAOT的 OpenClaw.NET 深度刨析

&#xff1a;自主智能体架构的演进与原生运行时的瓶颈大型语言模型&#xff08;LLM&#xff09;的快速成熟引发了软件工程领域的底层范式转移。行业焦点已从基于静态提示词&#xff08;Prompt&#xff09;的问答系统&#xff0c;全面转向具备自主规划、工具调用与长程逻辑推理能…...