中介者模式:优雅解耦的利器
在软件设计中,随着系统功能的不断扩展,对象之间的依赖关系往往会变得错综复杂,导致系统难以维护和扩展。为了降低对象之间的耦合度,提高系统的可维护性和可扩展性,设计模式应运而生。中介者模式(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 (最好只看到一个连上的设置…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
论文阅读:Matting by Generation
今天介绍一篇关于 matting 抠图的文章,抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法,已经有很多的工作和这个任务相关。这两年 diffusion 模型很火,大家又开始用 diffusion 模型做各种 CV 任务了&am…...
