行为型:中介者模式

目录

1、核心思想

2、实现方式

2.1 模式结构

2.2 实现案例

3、优缺点分析

4、适用场景

5、注意事项


1、核心思想

目的:通过引入一个中介对象来封装一组对象之间的交互,解决对象间过度耦合、频繁交互的问题。不管是对象引用维护还是消息的转发,都由处于中心节点的中介全权负责,最终架构出一套类似于星形拓扑的网络结构。

举例

1> 微服务架构中的注册发现中心

2> 数据库中的外键关系表

3> 网络设备中的路由器

4> Spring框架的DispatcherServlet:作为HTTP请求的中介者,协调Controller、Service和View的交互

2、实现方式

2.1 模式结构

四个核心角色:

  • Mediator(中介)​:共事者之间通信的中介平台接口,定义与共事者的通信标准,如连接注册方法与发送消息方法等。
  • ConcreteMediator(中介实现)​:可以有多种实现,持有所有共事者对象的列表,并实现中介定义的通信方法。
  •  Colleague(共事者/同事)​:定义所有同事对象的公共接口,包含对中介者的引用。
  • ConcreteColleague(共事实现/同事实现)​:实现同事类接口,负责具体业务逻辑,并在需要时调用中介者的方法。

2.2 实现案例

聊天室系统:

//1、中介者接口:定义消息发送方法
interface ChatMediator {void sendMessage(String message, User sender);void addUser(User user);
}//2、具体中介者:聊天室
class ChatRoom implements ChatMediator {private List<User> users = new ArrayList<>();@Overridepublic void sendMessage(String message, User sender) {users.stream().filter(user -> !user.equals(sender)).forEach(user -> user.receive(message););}@Overridepublic void addUser(User user) {users.add(user);}
}//3、同事类抽象
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator mediator, String name) {this.mediator = mediator;this.name = name;}public abstract void send(String message);public abstract void receive(String message);@Overridepublic boolean equals(Object o) {if (o == null || getClass() != o.getClass()) return false;User user = (User)o;return Objects.equals(name, user.name);}
}//4、具体同事类:聊天用户
class ChatUser extends User {public ChatUser(ChatMediator mediator, String name) {super(mediator, name);}@Overridepublic void send(String message) {System.out.println(name + " 发送消息: " + message);mediator.sendMessage(message, this); // 通过中介者转发消息}@Overridepublic void receive(String message) {System.out.println(name + " 收到消息: " + message);}
}//5、客户端
public class Client {public static void main(String[] args) {ChatMediator chatRoom = new ChatRoom();User alice = new ChatUser(chatRoom, "Alice");User bob = new ChatUser(chatRoom, "Bob");User charlie = new ChatUser(chatRoom, "Charlie");chatRoom.addUser(alice);chatRoom.addUser(bob);chatRoom.addUser(charlie);alice.send("大家好!");  // 输出:Alice 发送消息 → Bob和Charlie接收bob.send("你好,Alice!"); // 输出:Bob 发送消息 → Alice和Charlie接收}
}

3、优缺点分析

优点:

  • 降低耦合度:对象间不直接依赖,通过中介者通信。

  • 集中控制逻辑:交互逻辑集中在中介者,便于维护和扩展。

  • 简化对象职责:同事类只需关注自身行为,无需管理复杂交互。

  • 灵活扩展:新增同事类时,只需修改中介者,无需改动其他类。

缺点:

  • 中介者复杂度高:中介者可能承担过多职责,成为“上帝对象”。

  • 性能开销:中介者处理大量交互时可能成为性能瓶颈。

  • 设计难度:需合理划分中介者与同事类的职责,避免过度设计。

4、适用场景

  • 对象间交互复杂

    • 如GUI组件(按钮、输入框)联动,需统一协调。

  • 系统需解耦

    • 如微服务架构中,通过API网关协调服务间调用。

  • 多对多通信场景

    • 如聊天系统、多玩家游戏中的角色互动。

  • 需要集中管控的场景

    • 如空中交通管制系统、智能家居设备控制。

5、注意事项

  • 避免中介者臃肿

    • 若中介者逻辑过于复杂,可拆分多个子中介者或使用分层设计。

  • 合理设计通信协议

    • 定义清晰的中介者接口,明确消息传递格式和规则。

  • 性能优化

    • 对高频交互场景,采用异步处理或缓存机制提升效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

node_modules\node-sass: Command failed.报错了

node_modules\node-sass: Command failed.错误解决 第一步&#xff1a;删掉:目录中划红线的配置文件 删掉项目中的node_modules第二步&#xff1a;用admin权限执行&#xff0c;重新配置npm和yarn npm config set registry https://registry.npm.taobao.org --global npm con…

STM32 ADC工作原理与配置详解

文章目录 ADCADC简介逐次逼近型ADCADC框图ADC框图的工作流程&#xff08;以规则组为例&#xff09;1. 输入通道选择与信号接入2. 触发转换&#xff1a;软件或硬件触发3. 采样保持与量化编码4. 转换结果处理与存储5. 状态标志与中断6. 参考电压与时钟驱动7. 辅助功能&#xff1a…

1、Pytorch介绍与安装

1、Pytorch介绍 PyTorch 是由 Facebook AI Research (FAIR) 团队开发并维护的一款开源深度学习框架&#xff0c;于 2016 年首次发布。它因其直观的设计、卓越的灵活性以及强大的动态计算图功能&#xff0c;迅速在学术界和工业界获得了广泛认可&#xff0c;成为当前深度学习研究…

RedisTemplate查询不到redis中的数据问题(序列化)

RedisTemplate查询不到redis中的数据问题(序列化) 一.问题描述 存入Redis中的值取出来却为null,问题根本原因就是RedisTemplate和StringRedisTemplate的序列化问题、代码示例&#xff1a; SpringBootTest class Redis02SpringbootApplicationTests {Autowiredprivate RedisTe…

【Net】TCP粘包与半包

文章目录 TCP粘包与半包1 背景2 粘包&#xff08;packet stick&#xff09;3 半包&#xff08;packet split&#xff09;4 为什么会出现粘包/半包&#xff1f;5 如何解决&#xff1f;6 示例7 总结 TCP粘包与半包 在网络编程中&#xff0c;粘包和半包问题是常见的 TCP 协议特有…

Leetcode 3566. Partition Array into Two Equal Product Subsets

Leetcode 3566. Partition Array into Two Equal Product Subsets 1. 解题思路2. 代码实现 题目链接&#xff1a;3566. Partition Array into Two Equal Product Subsets 1. 解题思路 这一题我的实现还是比较暴力的&#xff0c;首先显而易见的&#xff0c;若要满足题目要求&…

QT中更新或添加组件时出现“”qt操作至少需要一个处于启用状态的有效资料档案库“解决方法”

在MaintenanceTool.exe中点击下一步 第一个&#xff1a; 第二个&#xff1a; 第三个&#xff1a; 以上任意一个放入资料库中

52. N-Queens II

题目描述 52. N-Queens II 回溯法 这道题与第51题是一样的。51. N-Queens-CSDN博客 class Solution {int columns; //从低位到高位起算&#xff0c;第i位为0表示棋盘第i列可以放置皇后&#xff0c;第i位为1表示棋盘第i列不能放置皇后//边长为n的棋盘分别有2n-1条正斜线和反…

解锁AI智能Agent的“风格基因”

从“黑箱”到“智能Agent”:LangChain的架构哲学革新 在LangChain出现之前,开发者直接调用LLM API的方式,充满了“黑箱”操作的挑战: 紧耦合的业务逻辑与模型调用: 所有的业务逻辑、API调用、记忆管理、错误处理等都可能混杂在同一个代码块中。这导致代码脆弱、难以测试,…

大数据运维过程中常见的一些操作

大数据运维是确保大数据系统稳定运行、高效处理数据的关键环节。以下是大数据运维过程中常见的一些操作和任务: 1. 集群部署与配置 基础设施搭建:部署服务器、网络设备、存储系统,配置虚拟化环境(如 Docker、Kubernetes)。分布式系统安装:安装 Hadoop、Spark、Hive、Kaf…

STM32中,如何理解看门狗

在STM32微控制器中&#xff0c;看门狗&#xff08;Watchdog&#xff09;是一种硬件计时器&#xff0c;用于监控系统运行状态&#xff0c;防止软件死锁或跑飞。其核心机制是&#xff1a;系统需定期“喂狗”&#xff08;复位看门狗计数器&#xff09;&#xff0c;若未及时喂狗&am…

[AI算法] LLM中的gradient checkpoint机制

文章目录 什么是gradient checkpoint原理使用场景 注意事项 什么是gradient checkpoint gradient checkpoint是一种优化深度学习模型内存使用的技术&#xff0c;尤其在训练大型模型时非常有用。它通过牺牲计算时间为代价来减少显存占用。大多数情况下&#xff0c;transformers…

船舶二阶非线性响应方程的EKF与UKF参数辨识

船舶二阶非线性响应方程的EKF与UKF参数辨识 本文将详细阐述使用Python实现扩展卡尔曼滤波(EKF)和无迹卡尔曼滤波(UKF)对船舶二阶非线性响应方程进行参数辨识的过程。全文包含理论推导、算法实现、仿真验证及结果分析。—### 1. 船舶二阶非线性响应方程建模船舶运动可表示为&am…

【ARM AMBA APB 入门 1.1 -- APB 读写寄存器 RTL 实现】

请阅读【ARM AMBA 总线 文章专栏导读】 文章目录 APB 寄存器访问APB 读寄存器 RTL 代码实现APB 写寄存器 RTL 代码实现 APB 寄存器访问 APB 读寄存器 RTL 代码实现 APB 总线读寄存器操作代码实现&#xff1a; wire [31:0] SOC_PLL_CFG_REG; wire [31:0] SOC_PLL_LOCK_REG; wi…

C++修炼:位图和布隆过滤器

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 1、引言 在计算机科学…

Java大厂后端技术栈故障排查实战:Spring Boot、Redis、Kafka、JVM典型问题与解决方案

Java大厂后端技术栈故障排查实战&#xff1a;Spring Boot、Redis、Kafka、JVM典型问题与解决方案 引言 在互联网大厂&#xff0c;Java后端系统往往承载着高并发、高可用和复杂业务需求。系统架构日益复杂&#xff0c;涵盖微服务、缓存、消息队列、数据库等多种组件&#xff0…

交叉编译tcpdump工具

1.导出交叉编译工具链 export PATH$PATH:/opt/rockchip/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf/bin 下载源码包libpcap-1.10.5&#xff0c;配置、并编译安装。 github仓库地址 ./configure --hostarm-linux CCarm-linux-gnueabihf-gcc --prefix$PWD/install …

Pytest Fixture 是什么?

Fixture 是什么&#xff1f; Fixture 是 Pytest 测试框架的核心功能之一&#xff0c;用于为测试函数提供所需的依赖资源或环境。它的核心目标是&#xff1a; ✅ 提供测试数据&#xff08;如模拟对象、数据库记录&#xff09; ✅ 初始化系统状态&#xff08;如配置、临时文件&a…

【深度剖析】流处理系统性能优化:解决维表JOIN、数据倾斜与数据膨胀问题

目录 前言:为什么你的流处理作业总是慢? 一、维表JOIN优化:从普通连接到高性能查询 1.1 时态表的双面性 1.2 Lookup Join 优化 1.3 多表JOIN优化策略 二、数据倾斜:单分区也会遇到的隐形杀手 2.1 单分区数据倾斜 2.2 热点键打散技术 2.3 时间窗口预聚合 三、数据…

Codeforces Round 1028 (Div. 2)(ABC)

A. Gellyfish and Tricolor Pansy 翻译&#xff1a; 水母和小花在玩一个叫 “决斗 ”的游戏。 水母有 a HP&#xff0c;花花有 b HP。 它们各有一个骑士。水母的骑士有 c HP&#xff0c;而花花的骑士有 d HP。 他们将进行一轮游戏&#xff0c;直到其中一方获胜。对于 k1、2、.…