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

23种设计模式-行为型模式之中介者模式(Java版本)

Java 中介者模式(Mediator Pattern)详解

🧠 什么是中介者模式?

中介者模式是一种行为型设计模式,它通过定义一个中介者对象来封装一组对象之间的交互。中介者使得各个对象不需要显式地知道彼此之间的关系,从而减少了对象之间的耦合。对象与对象之间通过中介者进行通信,避免了直接交互。

中介者模式常用于多个对象之间存在复杂的关系和交互时,能够减少对象之间的依赖关系并提高系统的灵活性。


🎯 使用场景

  • 当多个对象之间的交互复杂,直接通信会导致系统的复杂性增加时。
  • 需要避免类之间过多的耦合关系。
  • 系统中需要有一个集中式的对象来管理和协调各个对象的交互。

🏗️ 模式结构

  • Mediator(抽象中介者):定义一个接口,用来与不同的对象进行交互。
  • ConcreteMediator(具体中介者):实现中介者接口,协调不同对象之间的交互。
  • Colleague(同事类):每个同事类都与中介者对象交互。
  • ConcreteColleague(具体同事类):实现与中介者的交互方法,处理具体业务逻辑。

✅ 示例:聊天室中介者

抽象中介者类

public interface ChatRoomMediator {void sendMessage(String message, User user);void addUser(User user);
}

具体中介者类

import java.util.ArrayList;
import java.util.List;public class ChatRoom implements ChatRoomMediator {private List<User> users;public ChatRoom() {this.users = new ArrayList<>();}@Overridepublic void sendMessage(String message, User user) {for (User u : users) {// 排除发送消息的用户if (u != user) {u.receive(message);}}}@Overridepublic void addUser(User user) {this.users.add(user);}
}

同事类(用户)

public abstract class User {protected ChatRoomMediator mediator;protected String name;public User(ChatRoomMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void sendMessage(String message);public abstract void receive(String message);
}

具体同事类(用户实现)

public class ConcreteUser extends User {public ConcreteUser(ChatRoomMediator mediator, String name) {super(mediator, name);}@Overridepublic void sendMessage(String message) {System.out.println(this.name + " sending message: " + message);mediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println(this.name + " received message: " + message);}
}

客户端

public class Client {public static void main(String[] args) {ChatRoom chatRoom = new ChatRoom();User user1 = new ConcreteUser(chatRoom, "Alice");User user2 = new ConcreteUser(chatRoom, "Bob");User user3 = new ConcreteUser(chatRoom, "Charlie");chatRoom.addUser(user1);chatRoom.addUser(user2);chatRoom.addUser(user3);user1.sendMessage("Hi Bob!");user2.sendMessage("Hello Alice!");user3.sendMessage("Hey everyone!");}
}

✅ 优点

  • 减少了类之间的耦合:通过中介者对象来协调交互,避免了对象直接通信。
  • 集中式控制:所有的交互通过中介者控制,简化了系统的复杂度。
  • 提高灵活性:如果要增加新的交互,只需要修改中介者,不需要改变具体的同事类。

⚠️ 缺点

  • 中介者可能成为“上帝对象”:中介者对象可能会变得非常庞大,包含大量的逻辑,导致代码不易维护。
  • 增加系统的复杂性:对于简单的交互,使用中介者模式可能会引入不必要的复杂性。

🧩 使用建议

中介者模式适用于处理对象之间复杂交互的场景,尤其是当多个对象之间的关系密切并且频繁交互时。通过中介者模式可以有效地减少类之间的直接耦合,增加系统的可维护性和扩展性。

典型应用场景包括:

  • GUI系统中组件之间的交互;
  • 多对象间的协作和消息传递;
  • 复杂的工作流或流程管理。

相关文章:

23种设计模式-行为型模式之中介者模式(Java版本)

Java 中介者模式&#xff08;Mediator Pattern&#xff09;详解 &#x1f9e0; 什么是中介者模式&#xff1f; 中介者模式是一种行为型设计模式&#xff0c;它通过定义一个中介者对象来封装一组对象之间的交互。中介者使得各个对象不需要显式地知道彼此之间的关系&#xff0c…...

集群与存储-lvs-nat实验

一、实验目的 1、熟练掌握ipvsadm 指令的使用 2、理解lvs 负载均衡的原理 3. 熟练掌握lvs-netnfs的配置 二、实验内容 1.拓扑图 2.实验步骤 #在节点服务器中添加网卡&#xff0c;选择仅主机模式 #查看网卡 #启用网卡 nmcli device up ens224 ip a #修改虚拟地址的网关 #…...

Android——Serializable和Parcelable

在Android中传递对象的方式 在 Android 开发中&#xff0c;Parcelable 和 Serializable 是两种用于对象序列化的接口 Serializable public class Student implements Serializable {public int id;public String name;public int age;public Student(int id, String name, i…...

python:sklearn 决策树(Decision Tree)

5. 决策树&#xff08;Decision Tree&#xff09; - 第5章 算法思想&#xff1a;基于信息增益&#xff08;ID3&#xff09;或基尼不纯度&#xff08;CART&#xff09;递归划分特征。 编写 test_dtree_1.py 如下 # -*- coding: utf-8 -*- """ 5. 决策树&…...

0-1背包难题哪家强:回溯法 VS 动态规划 VS 贪心算法

回溯法、动态规划和贪心算法是三种常见的算法设计思想&#xff0c;他们都可以用来解决0-1背包问题&#xff0c;但它们在解决问题的思路、适用条件和效率上存在显著差异。以下从多个维度进行对比分析&#xff1a; 相关系列文章链接: 《贪心算法 vs 动态规划&#xff1a;“急性子…...

JavaSE第12篇:接口interface

一、使用步骤 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings(ignore) import ssl ssl._create_default_https_con…...

一文掌握 npm 基础与常用指令

初学前端&#xff1f;npm 常用指令不熟&#xff1f;想了解 pnpm、yarn、cnpm 有什么不同&#xff1f; 这篇文章将带你从入门到精通&#xff0c;全面掌握 npm 的使用方法&#xff0c;以及选择适合自己项目的包管理工具&#xff01; 文章目录 一、什么是 npm&#xff1f;二、npm …...

OpenObserve API Usage Guide for Log Management

OpenObserve API Usage Guide for Audit Log Management 1. 概述 1.1 目标 本文档旨在详细介绍 OpenObserve 的 API 使用方法&#xff0c;帮助用户通过 API 实现日志管理功能&#xff0c;包括日志摄入、查询、模糊匹配&#xff08;类似 SQL 的 LIKE&#xff09;、stream 管理…...

机器学习实操 第一部分 机器学习基础 第5章 支持向量机(SVM)

机器学习实操 第一部分 机器学习基础 第5章 支持向量机&#xff08;SVM&#xff09; 内容概要 第5章深入介绍了支持向量机&#xff08;SVM&#xff09;&#xff0c;这是一种功能强大且应用广泛的机器学习模型。SVM适用于线性或非线性分类、回归以及 novelty detection。本章详…...

CSRF(cross-site request forgery)跨域请求访问

CSRF 当我们在成功登录一个网站后&#xff0c;会将后端返回的cookie数据进行存放&#xff0c;每一次访问该域名都会将cookie存放在请求头&#xff0c;也就相当于用户登录凭证&#xff0c; 但这种同域自动携带cookie存在一种问题 那就是当恶意网站也进去请求时&#xff0c;同样…...

Kafka的Rebalance机制可能引发什么问题?如何优化?怎么减少不必要的Rebalance

Rebalance机制的核心目的是确保每个消费者都能处理适当数量的分区&#xff0c;以实现负载均衡和高可用性。 一般是消费者组发生变化的时候&#xff0c;比如订阅主题&#xff0c;消费者数量等等发生变化&#xff0c;可能会导致rebalance&#xff0c;rebalance会导致消费者组短时…...

【和春笋一起学C++】函数——C++的编程模块

目录 1. 原型句法 2. 函数分类 3. 函数参数之按值传递 4. 数组作为函数参数 在C中&#xff0c;要使用函数&#xff0c;必须要有这三个方面&#xff1a; 函数原型&#xff0c;函数原型描述了函数到编译器的接口&#xff0c;函数原型一般放在include文件中。函数原型告诉编译…...

Java高频面试之并发编程-11

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;父子线程如何共享数据&#xff1f; 在Java中&#xff0c;父子线程共享数据可以通过以下几种方式实现&#xff0c;具体…...

LangChain入门(四) 部署应用程序

1、使用LangServe部署应用程序 安装langserve pip install langserve[all] 代码示例 from fastapi import FastAPI from langchain.chat_models import init_chat_model from langchain_core.messages import SystemMessage, HumanMessage from langchain_core.output_parser…...

精益数据分析(31/126):电商关键指标深度解析与实战策略

精益数据分析&#xff08;31/126&#xff09;&#xff1a;电商关键指标深度解析与实战策略 在创业和数据分析的探索之路上&#xff0c;每一次深入学习都像是解锁了新的技能&#xff0c;让我们离成功更近一步。今天&#xff0c;我依旧带着和大家共同进步的想法&#xff0c;深入…...

【MongoDB篇】MongoDB的集合操作!

目录 引言第一节&#xff1a;集合的“诞生”——自动出现还是手动打造&#xff1f;&#x1f914;第二节&#xff1a;集合的“查阅”——看看这个数据库里有哪些柜子&#xff1f;&#x1f4c2;&#x1f440;第三节&#xff1a;集合的“重命名”——给文件柜换个名字&#xff01;…...

antd中的表格穿梭框(Transfer)如何使用

穿梭框是什么?怎么使用? 需求如下: 有一组端口需要分配给具体接口 功能要求: 1. 需要展示当前端口名称及其所属的接口 2. 需支持搜索功能可对端口名或接口名进行筛选便于分配 3. 分配端口时,需检测当前接口内的端口是否满足此接口最低要求 4. 提供Select下拉框,可供查…...

联邦学习与安全多方计算的结合是隐私保护机器学习领域

联邦学习(Federated Learning, FL)与安全多方计算(Secure Multi-Party Computation, MPC)的结合是隐私保护机器学习领域的前沿方向,其框架设计需兼顾计算效率、安全性和可扩展性。以下是结合两者的框架设计与实现流程的详细解析: 一、框架设计核心目标 隐私保护:确保多…...

mongoose的介绍,连接数据库

Mongoose 是一个基于 Node.js 的 MongoDB ODM&#xff08;Object Data Modeling&#xff09;库&#xff0c;用于在 MongoDB 和 Node.js 应用之间提供结构化的模型层&#xff0c;帮助你更优雅、安全地操作数据库。 &#x1f9fe; 一、Mongoose 简介 &#x1f4e6; 功能&#xff…...

Pytest中的fixture装饰器详解

pytest是Python生态中最流行的自动化测试框架&#xff0c;它通过简洁的语法、强大的功能(如fixture、参数化、插件扩展等)和丰富的插件生态&#xff0c;帮助开发者高效完成单元测试、集成测试和端到端测试。fixture是pytest框架中最核心、最强大的功能之一&#xff0c;它提供了…...

Linux系统配置JDK

目录 一、xftp传输JDK包 1、新建xftp会话并连接到我们的服务器 2、上传jdk包 二、配置环境变量 为了方便javaweb项目的建立&#xff0c;我们需要在搭建好的linux环境下配置安装JDK环境 一、xftp传输JDK包 因为jdk包文件比较大了&#xff0c;这时候不能使用简单的linux上传…...

通义千问最新一代大语言模型Qwen3发布了

通义千问Qwen3全面解析&#xff1a;最强开源大模型Ollama本地运行实战 &#x1f525; 最新重大好消息&#xff01; 经过漫长的等待&#xff0c;今天凌晨阿里云正式发布了Qwen3大语言模型&#xff01;本次更新带来了0.6b 1.7b 4b 8b 14b 30b 32b 235b超大参数模型&#xff0c;更…...

想做博闻强记的自己

2025年4月29日&#xff0c;13~25℃&#xff0c;还好 待办&#xff1a; 冶金《物理》期末测试 阅卷&#xff08;冶金《物理》期末测试试卷&#xff09; 重修《物理》《物理2》电子材料归档 规则变更&#xff0c;《高等数学2》期末试卷推倒重来 遇见&#xff1a;直播画面。 感受…...

爱普生SG2520HHN晶振数据中心服务器的理想解决方案

在当今数字化时代&#xff0c;数据中心作为海量数据存储、处理与传输的核心枢纽&#xff0c;其服务器的高效稳定运行至关重要。服务器作为其核心设备&#xff0c;对时钟信号的精度和稳定性提出了严苛要求——微小的时序误差可能导致数据传输失败或系统宕机。爱普生 SG2520HHN 差…...

【Prometheus-MySQL Exporter安装配置指南,开机自启】

目录 1. 创建 MySQL 监控用户2. 配置 MySQL 认证文件3. 安装 mysqld_exporter4. 配置 Systemd 服务5. 启动并验证服务6. 修改Prometheus配置常见错误排查错误现象排查步骤 6. 验证监控数据关键注意事项 1. 创建 MySQL 监控用户 mysql -uroot -p123456 # 登录MySQL-- 1. 创建监…...

Linux 服务管理两种方式service和systemctl

Linux 服务管理两种方式service和systemctl 确定当前系统使用的哪种命令用来启动服务 SysV init 或者 systemd 使用下面的命令&#xff1a; ps -p 1例如&#xff0c;输出&#xff1a; PID TTY TIME CMD1 ? 00:00:02 systemdSysV init service命令用于对系统…...

P1494 [国家集训队] 小 Z 的袜子 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 q q q 次查询&#xff0c;每次查询给定 ( l , r ) (l,r) (l,r). 你需要求出 2 ∑ i ≤ i < j ≤ r [ a i a j ] ( r − l ) ( r − l 1 ) \dfrac{2\sum…...

(开源)视频画面增强模型:Ev-DeblurVSR (可以解决视频画面不清晰的问题)

在计算机视觉领域&#xff0c;模糊视频超分辨率&#xff08;BVSR&#xff09;是一个复杂且具有挑战性的任务&#xff0c;目标是从低分辨率&#xff08;LR&#xff09;和模糊的输入生成高分辨率&#xff08;HR&#xff09;视频。传统方法常常因缺乏足够运动信息和高频细节而表现…...

探索豆包WEB/PC超能创意1.0:创意新利器的全面解析

在当今数字化创意蓬勃发展的时代&#xff0c;新工具不断涌现&#xff0c;为创作者们带来了更多的可能性。豆包WEB/PC超能创意1.0便是其中一款备受瞩目的产品&#xff0c;它的出现为创意工作者和爱好者们打开了一扇充满无限可能的大门。 一、体验信息&#xff1a;探索创意新领域…...

五、UI自动化测试05--PyTest框架

目录 一、PyTest 框架2. 特点2. 安装步骤3. 基本使⽤3.1 测试函数形式3.2 执⾏⽅式3.3 测试类形式3.4 执⾏⽅式3.5 另⼀种执⾏⽅式: 主函数执⾏3.6 特殊⽅法: 函数级别3.7 特殊⽅法: 类级别3.8 特殊⽅法: 函数级别和类级别同时使⽤ 4. pytest 配置⽂件4.1 选项字段获取4.2 编写…...

51LA使用方法与悟空统计,网站数据分析的双重选择

在网站运营与数据分析领域&#xff0c;51LA作为国内较早的流量统计工具&#xff0c;曾为许多用户提供基础的访问数据监测服务。然而&#xff0c;随着技术的发展和用户需求的升级&#xff0c;越来越多的企业开始寻求功能更全面、体验更优的统计工具。小编今天将给大家介绍一款更…...

MongoDB的下载安装与启动

MongoDB的下载安装与启动&#xff0c; 一、MongoDB下载安装 1. 官网下载 打开官网&#xff1a;https://www.mongodb.com/try/download/community选择&#xff1a; 版本&#xff08;Version&#xff09;&#xff1a;选最新版或者根据需要选旧版。平台&#xff08;OS&#xff0…...

解决ktransformers v0.3 docker镜像中 operator torchvision::nms does not exist 问题

问题背景 更新ktransformers docker镜像到v0.3版本后&#xff08;之前为v0.2.4post1&#xff09;&#xff0c;使用更新前启动命令无法正确启动服务&#xff0c;提示以下错误&#xff1a; Traceback (most recent call last):File "/workspace/ktransformers/ktransforme…...

MySQL事务隔离级别的实现原理MVCC

一、什么是MVCC? MVCC(Multi-Version Concurrency Control)&#xff0c;即多版本并发控制&#xff0c;是并发读写场景下&#xff0c;数据库层面提供的一种解决方案。 数据库的并发场景有以下三种&#xff1a; 读读 当多个事务同时进行读取操作时&#xff0c;它们之间不存在…...

EtherCAT 分布式时钟(DC)补偿技术解析

一、技术定义 EtherCAT 分布式时钟(Distributed Clock, DC)是一种基于硬件的高精度同步机制,旨在解决工业自动化系统中多设备协同控制的时间同步问题。其核心功能包括: 初始偏移补偿:消除从站本地时钟与主站系统时间的初始偏差,确保所有设备在启动阶段的时间基准一致。…...

7.进程概念(三)

一、进程优先级 是什么&#xff1f; 进程得到CPU资源的先后顺序。 为什么要有进程优先级&#xff1f; 目标资源稀缺&#xff0c;导致要通过优先级确定谁先谁后。 如何比较和分配&#xff1f; 进程优先级也是一种数字&#xff0c;int&#xff0c;task_struct 值越低&#xff0c;…...

MATLAB小试牛刀系列(2)

问题描述 捷运公司在下一年度 1 - 4 月的 4 个月内拟租用仓库堆放物资。已知各月所需仓库面积列于表 1.1。仓库租借费用随合同期而定&#xff0c;期限越长&#xff0c;折扣越大&#xff0c;具体数字见表 1.1。租借合同每月初都可办理&#xff0c;每份合同具体规定租用面积和期…...

一个SciPy图像处理案例的全过程

本文利用SciPy进行图像处理&#xff0c;并记录图像处理的全过程&#xff0c;处理过程包含高斯模糊、腐蚀等操作。 代码 import matplotlib.pyplot as plt import numpy as np from scipy import ndimage# 设置图像的大小为 128x128&#xff0c;即 128x128 的逻辑像素 l 128 …...

修改输入框选择框颜色

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 有时候需要改写element原来输入框/选择框的颜色 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 输入框的话需要hover时边框颜色修改&#xff0c;选择值的时候边框颜色修改以及选…...

rust 全栈应用框架dioxus

逛github时发现了一个号称全栈应用框架dioxus,适用于web / desktop / mobile。零配置、集成了热启动和基于信号的状态管理。是由rust编写的&#xff0c;所以也就不受平台限制。 既然说的这么好&#xff0c;那就来试试构建一下三种平台的应用&#xff0c;构建的应用编译成web 、…...

电子电器框架 --- 数据连接性和云集成在增强电气/电子架构方面的作用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

Nvidia 可能会发布具有增强内存配置的 RTX 5080 和 5070 Super

距离英伟达正式发布RTX 50系列显卡仅过去数月&#xff0c;有关"Super"系列升级版显卡的传闻已甚嚣尘上。据硬件爆料平台Chiphell论坛&#xff08;该消息源可靠性参差不齐&#xff09;用户透露&#xff0c;英伟达可能正在研发配备24GB显存的RTX 5080 Super和16GB显存的…...

预留库存的实现

1. 实体类 import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data;import java.sql.Timestamp;Data TableName("products") public class Product {private Long id;private String name;private int stock; }Data TableName("shopping_c…...

[逆向工程]如何理解小端序?逆向工程中的字节序陷阱与实战解析

[逆向工程]如何理解小端序&#xff1f;逆向工程中的字节序陷阱与实战解析 关键词&#xff1a;逆向工程、小端序、字节序、二进制分析、数据解析 引言&#xff1a;为什么字节序是逆向工程师的必修课&#xff1f; 在逆向工程中&#xff0c;分析二进制数据是最基础的任务之一。…...

【Python笔记 05】 if判断、比较运算符与逻辑运算符

一、if判断 1、基本格式 if 要判断的条件&#xff1a; #条件成立为true条件成立的时候要做的事情注&#xff1a;注意判断条件后面的冒号&#xff0c;以及条件成立要做的事情此行代码的缩进&#xff0c;最好是软件自动缩进。 2、练习题 用户在控制台输入成绩&#xff0c;…...

AI应用实战:Excel表的操作工具

有个小需求是这样的&#xff0c;需要在一份数据表里&#xff0c;将1000多个客户的月报数据分别单独截图存档&#xff0c;有客户需要的时候就要发给客户&#xff0c;截图下来的也是以客户为命名&#xff0c;这样查找时也比较容易匹配上。 在没有写工具之前&#xff0c;以往财务…...

P1903 [国家集训队] 数颜色 / 维护队列 Solution

Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;有 m m m 个操作分两种&#xff1a; modify ⁡ ( i , x ) \operatorname{modify}(i,x) modify(i,x)&#xff1a;执行 a i ← x a_i\gets x ai​←x. query ⁡ ( …...

Transformer数学推导——Q33 分析正弦编码的频率衰减对长程依赖建模的影响

该问题归类到Transformer架构问题集——位置编码——绝对位置编码。请参考LLM数学推导——Transformer架构问题集。 1. 背景知识&#xff1a;Transformer 与长程依赖 在自然语言处理和其他序列数据处理任务中&#xff0c;Transformer 模型凭借其强大的性能脱颖而出。与传统的…...

微服务架构下的熔断与降级:原理、实践与主流框架深度解析

微服务架构下的熔断与降级&#xff1a;原理、实践与主流框架深度解析 在现代分布式系统中&#xff0c;熔断 (Circuit Breaker) 和 降级 (Degrade) 是保障系统弹性与高可用性的核心机制。本文将系统解析两者的原理、区别与协同方式&#xff0c;并结合主流框架 (Resilience4j、S…...

大脑、机器人与贝叶斯信念及AI推理

在机器不再局限于重复性任务的世界里&#xff0c;机器人技术已经大胆地迈入了感知、学习和决策的领域。这篇文章探讨了智能机器人系统是如何构建的——从理解它们嘈杂的传感器和不确定的环境&#xff0c;到使它们能够做出明智的选择并随着时间的推移调整自己的行为。 AI推理 …...