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

java23种设计模式-中介者模式

中介者模式(Mediator Pattern)学习笔记


编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793
DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039


1. 模式定义

行为型设计模式,通过定义一个中介对象来封装一系列对象之间的交互。减少对象间的直接耦合,使其可以独立改变交互方式。

2. 适用场景

✅ 对象之间存在复杂的网状引用关系
✅ 需要集中控制多个对象间的交互
✅ 需要限制对象之间的直接通信
✅ 希望复用组件间的交互逻辑
✅ 需要动态改变对象间的交互规则

3. 模式结构

knows
interacts-with
«interface»
Mediator
+notify(sender: Colleague, event: String)
ConcreteMediator
-colleagueA: Colleague
-colleagueB: Colleague
+notify()
«abstract»
Colleague
-mediator: Mediator
+setMediator()
+send()
+receive()
ConcreteColleagueA
+send()
+receive()
ConcreteColleagueB
+send()
+receive()

4. 核心角色

角色说明
Mediator抽象中介者,定义通信接口
ConcreteMediator具体中介者,协调各同事对象的行为
Colleague抽象同事类,持有中介者引用
ConcreteColleague具体同事类,通过中介者与其他同事通信

5. 代码示例

5.1 聊天室示例

// 抽象中介者
interface ChatMediator {void sendMessage(String msg, User user);void addUser(User user);
}// 具体中介者
class ChatRoom implements ChatMediator {private List<User> users = new ArrayList<>();public void sendMessage(String msg, User user) {for (User u : users) {if (u != user) {  // 不发送给自己u.receive(msg);}}}public void addUser(User user) {users.add(user);}
}// 抽象同事类
abstract class User {protected ChatMediator mediator;protected String name;public User(ChatMediator med, String name) {this.mediator = med;this.name = name;}public abstract void send(String msg);public abstract void receive(String msg);
}// 具体同事类
class ChatUser extends User {public ChatUser(ChatMediator med, String name) {super(med, name);}public void send(String msg) {System.out.println(name + " 发送消息: " + msg);mediator.sendMessage(msg, this);}public void receive(String msg) {System.out.println(name + " 收到消息: " + msg);}
}// 客户端
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 收到消息: 大家好! */}
}

6. 模式变种

6.1 事件总线模式

// 基于观察者模式的扩展
class EventBusMediator {private Map<Class<?>, List<Consumer<?>>> handlers = new ConcurrentHashMap<>();public <T> void subscribe(Class<T> eventType, Consumer<T> handler) {handlers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(handler);}public <T> void publish(T event) {List<Consumer<?>> consumers = handlers.get(event.getClass());if (consumers != null) {consumers.forEach(c -> ((Consumer<T>)c).accept(event));}}
}// 使用示例
EventBusMediator bus = new EventBusMediator();
bus.subscribe(String.class, msg -> System.out.println("处理字符串: " + msg));
bus.publish("测试消息");

7. 优缺点分析

✔️ 优点

  • 减少对象间耦合
  • 集中控制交互逻辑
  • 简化同事类实现
  • 符合迪米特法则
  • 便于扩展新的同事类

缺点

  • 中介者可能变得过于复杂(上帝对象)
  • 中介者故障会导致系统整体失效
  • 可能降低系统运行效率
  • 增加系统设计复杂度

8. 相关模式对比

模式目的关键区别
观察者模式对象间通知机制观察者模式是分布式,中介者是集中式
门面模式简化子系统接口门面模式侧重简化接口,中介者协调交互
代理模式控制对象访问中介者协调多个对象,代理控制单个对象

9. 实际应用案例

  • Java Timer的调度机制(协调多个TimerTask)
  • MVC框架的控制器(协调Model和View)
  • 航空管制系统(协调飞机通信)
  • GUI框架中的对话框组件交互
  • 游戏引擎中的碰撞检测系统
  • Spring框架的ApplicationContext
  • JMS(Java Message Service)的消息路由

10. 最佳实践建议

  1. 合理划分职责:避免中介者承担过多责任
  2. 分层中介者:复杂系统可建立多级中介者
  3. 结合其他模式
    • 与观察者模式结合实现事件通知
    • 与命令模式结合实现操作队列
  4. 使用接口编程:保持中介者和同事类的抽象性
  5. 异常处理机制:确保中介者可靠处理异常
  6. 性能优化:对高频交互进行批处理或异步处理

11. 扩展应用(订单处理系统)

// 中介者接口
interface OrderMediator {void placeOrder(Order order);void cancelOrder(String orderId);void notifyWarehouse(Order order);void notifyPayment(Order order);
}// 具体中介者
class OrderProcessor implements OrderMediator {private PaymentService payment;private WarehouseService warehouse;private NotificationService notification;public void placeOrder(Order order) {if (payment.process(order)) {warehouse.prepare(order);notification.sendEmail(order.getUser(), "订单已确认");}}// 实现其他方法...
}// 同事类示例
class PaymentService {private OrderMediator mediator;public boolean process(Order order) {// 支付处理逻辑...mediator.notifyWarehouse(order);return true;}
}// 客户端调用
OrderMediator mediator = new OrderProcessor();
Order order = new Order("123", 99.99);
mediator.placeOrder(order);

🎯 设计原则体现

  1. 迪米特法则:减少对象间的直接通信
  2. 单一职责原则:交互逻辑集中到中介者
  3. 开闭原则:新增同事类无需修改现有代码

通过中介者模式,可以有效地解耦复杂系统中的交互关系,特别适合需要集中管理多方交互的企业级应用场景。该模式在GUI开发、工作流引擎和分布式系统协调中应用广泛,是管理复杂对象关系的经典解决方案。

相关文章:

java23种设计模式-中介者模式

中介者模式&#xff08;Mediator Pattern&#xff09;学习笔记 编程相关书籍分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145855793 DeepSeek使用技巧pdf资料分享&#xff1a;https://blog.csdn.net/weixin_47763579/article/details/145884039 1.…...

鸿蒙next 点击穿透实现

点击穿透可以参考华为开发的保留文章,该章节只能在developer preview版本下查看 点击穿透 主要的方法是hitTestBehavior // xxx.ets Entry Component struct HitTestBehaviorExample {build() {// outer stackStack() {Button(outer button).onTouch((event) > {console.i…...

OpenAPI Generator:API开发的瑞士军刀

一、工具介绍 OpenAPI Generator是基于OpenAPI规范(Swagger)的代码生成工具&#xff0c;支持50种编程语言的客户端/服务端代码生成。其核心价值在于&#xff1a; 自动化生成⇒减少重复劳动规范API开发流程 核心能力矩阵&#xff1a; 功能支持示例客户端SDK生成Java/Python/T…...

某住宅小区地下车库安科瑞的新能源汽车充电桩的配电设计与应用方案 安科瑞 耿笠

摘要&#xff1a;纯电动商用车的工作环境存在路况复杂、工况恶劣等情况&#xff0c;导致整车电气设备的磨损速率加快&#xff0c;造成电气设备绝缘电阻持续下降&#xff0c;如不及时处理&#xff0c;可能存在安全隐患或引发重大安全事故。文章从绝缘故障检测原理出发&#xff0…...

电子科技大学考研复习经验分享

电子科技大学考研复习经验分享 本人情况&#xff1a;本科就读于电科软院&#xff0c;24年2月开始了解考研&#xff0c;24年3月开始数学&#xff0c;9月决定考本院&#xff08;开始全天候图书馆学习&#xff09;并开始专业课学习&#xff0c;11月底开始政治学习&#xff0c;最后…...

2025面试Go真题第一场

前几天参加了一场面试&#xff0c;GoLang 后端工程师&#xff0c;他们直接给了我 10 道题&#xff0c;我留了一个截图。 在看答案之前&#xff0c;你可以先简单做一下&#xff0c;下面我会对每个题目做一个说明。 文章目录 1、golang map 是否并发安全?2、协程泄漏的原因可能是…...

【量化策略】趋势跟踪策略

【量化策略】趋势跟踪策略 &#x1f680;量化软件开通 &#x1f680;量化实战教程 技术背景与应用场景 在金融市场中&#xff0c;趋势跟踪策略是一种基于市场趋势进行交易的量化投资方法。该策略的核心思想是“顺势而为”&#xff0c;即当市场出现明显的上升或下降趋势时&a…...

leetcode 541. 反转字符串 II 简单

给定一个字符串 s 和一个整数 k&#xff0c;从字符串开头算起&#xff0c;每计数至 2k 个字符&#xff0c;就反转这 2k 字符中的前 k 个字符。 如果剩余字符少于 k 个&#xff0c;则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个&#xff0c;则反转前 k 个字符&…...

org.springframework.boot不存在的其中一个解决办法

最近做项目的时候发现问题&#xff0c;改了几次pom.xml文件之后突然发现项目中的注解全部爆红。 可以尝试点击左上角的循环小图标&#xff0c;同步所有maven项目。 建议顺便检查一下Project Structure中的SDK和Language Level是否对应&#xff0c;否则可能报类似&#xff1a;“…...

AI绘画软件Stable Diffusion详解教程(2):Windows系统本地化部署操作方法(专业版)

一、事前准备 1、一台配置不错的电脑&#xff0c;英伟达显卡&#xff0c;20系列起步&#xff0c;建议显存6G起步&#xff0c;安装win10或以上版本&#xff0c;我的显卡是40系列&#xff0c;16G显存&#xff0c;所以跑大部分的模型都比较快&#xff1b; 2、科学上网&#xff0…...

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL&#xff08;结构化查询语言&#xff09;中的四个重要类别&#xff0c;它们分别用于不同类型的数据库操作&#xff0c;下面为你简单明了地解释这四类语句&#xff1a; 1. DQL&#xff08;数据查询语言&#xff0c;Data Query Langu…...

Linux中Shell运行原理和权限(下)(4)

文章目录 前言一、Shell的运行原理二、Linux当中的权限问题Linux权限的概念如何将普通用户添加到信任列表 三、Linux权限管理文件访问者的分类&#xff08;人&#xff09;文件类型和访问权限&#xff08;事物属性&#xff09;文件权限值的表示方法文件访问权限的相关设置方法如…...

LeetCode热题100- 字符串解码【JavaScript讲解】

古语有云&#xff1a;“事以密成&#xff0c;语以泄败”&#xff01; 关于字符串解码&#xff1a; 题目&#xff1a;题解&#xff1a;js代码&#xff1a;代码中遇到的方法&#xff1a;repeat方法&#xff1a;为什么这里不用this.strstack.push(result)&#xff1f; 题目&#x…...

每日一题——LRU缓存机制的C语言实现详解

LRU缓存机制的C语言实现详解 参考1. 数据结构设计双向链表节点哈希表节点哈希表LRU缓存结构 2. 初始化哈希表和双向链表哈希函数初始化哈希表初始化双向链表创建LRU缓存 3. 更新双向链表4. 实现Get操作5. 实现Put操作更新节点值删除最久未使用节点插入或更新节点 6. 释放缓存释…...

Leetcode3162:优质数对的总数 I

题目描述&#xff1a; 给你两个整数数组 nums1 和 nums2&#xff0c;长度分别为 n 和 m。同时给你一个正整数 k。 如果 nums1[i] 可以除尽 nums2[j] * k&#xff0c;则称数对 (i, j) 为 优质数对&#xff08;0 < i < n - 1, 0 < j < m - 1&#xff09;。 返回 优…...

docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结

官方网站 官方网址&#xff1a;etcd 二进制包下载&#xff1a;Install | etcd GitHub社区项目&#xff1a;etcd-io GitHub GitHub社区项目版本历史&#xff1a;Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...

Apache SeaTunnel 构建实时数据同步管道(最新版)

文章作者 王海林 白鲸开源 数据集成引擎研发 Apache SeaTunnel Committer & PMC Member&#xff0c;Apache SkyWalking Committer&#xff0c;多年平台研发经验&#xff0c;目前专注于数据集成领域。 导读 在当今数字化快速发展的时代&#xff0c;数据已然成为企业决策…...

递归、搜索与回溯第二讲:二叉树中的深搜 穷举vs暴搜vs深搜vs回溯vs剪枝

递归、搜索与回溯第二讲&#xff1a;二叉树中的深搜 && 穷举vs暴搜vs深搜vs回溯vs剪枝 1.计算布尔二叉树的值2.求根节点到叶结点数字之和3.二叉树剪枝4.验证二叉搜索树5.二叉搜索树中第K小的元素6.二叉树的所有路径7.全排列8.子集 1.计算布尔二叉树的值 2.求根节点到叶…...

Hbase分布式——储存机制

说明&#xff1a; 客户端调用&#xff0c;到达zk。然后到大HMaster&#xff08;主节点可以有多个但是只有和active在一起的才有效。&#xff09;。然后找到一个HRegionServer&#xff08;从节点可以有多个&#xff09;去做保存操作。 每一个HRegionServer上管理着表的HRegion…...

Word表格中如何只单独调整某一单元格宽度

大家好&#xff0c;我是小鱼。 在日常制作Word表格时&#xff0c;表格中不同单元格有时需要设置不同的宽度&#xff0c;但是很多小伙伴会发现想单独调整某一个单元格宽度时&#xff0c;发现其它单元格宽度也会发生变化。那么&#xff0c;到底怎么才能单独调整某一单元格宽度呢…...

解决tomcat8-maven-plugin插件运行报错的完整指南(含常见错误排查)

解决tomcat8-maven-plugin插件运行报错的完整指南 最近在项目中使用tomcat8-maven-plugin插件时&#xff0c;遇到了不少令人头疼的问题。特别是那个经典的类加载器冲突错误&#xff0c;让不少开发者都踩过坑。本文将系统梳理这些常见问题&#xff0c;提供经过验证的解决方案&am…...

Sabaki围棋软件终极指南:免费优雅的围棋对弈与棋谱编辑器

Sabaki围棋软件终极指南&#xff1a;免费优雅的围棋对弈与棋谱编辑器 【免费下载链接】Sabaki An elegant Go board and SGF editor for a more civilized age. 项目地址: https://gitcode.com/gh_mirrors/sa/Sabaki 如果你正在寻找一款既美观又功能强大的围棋软件&…...

Phi-3-mini-4k-instruct-gguf镜像免配置实战:独立venv+健康检查+一键访问

Phi-3-mini-4k-instruct-gguf镜像免配置实战&#xff1a;独立venv健康检查一键访问 1. 平台介绍 Phi-3-mini-4k-instruct-gguf是微软Phi-3系列中的轻量级文本生成模型GGUF版本&#xff0c;特别适合问答、文本改写、摘要整理和简短创作等场景。这个镜像已经完成了本地部署&…...

Z-Image-GGUF提示词社区构建:借鉴开源项目运营中文社区

Z-Image-GGUF提示词社区构建&#xff1a;借鉴开源项目运营中文社区 最近在玩Z-Image-GGUF这个图像生成模型&#xff0c;发现效果确实不错&#xff0c;但有个问题挺让人头疼的——提示词怎么写才能出好图&#xff1f;网上搜到的教程要么太零散&#xff0c;要么就是英文的&#…...

从训练到推理全程守护:大模型MLOps隐私保护流水线设计(含Airflow+OpenMined集成方案)

第一章&#xff1a;大模型工程化中的数据隐私保护 2026奇点智能技术大会(https://ml-summit.org) 在大模型工程化落地过程中&#xff0c;训练与推理阶段的数据流动极易暴露敏感信息。用户输入、微调语料、梯度更新乃至缓存日志都可能成为隐私泄露的入口。合规性要求&#xff0…...

从AUC到PCOC:广告点击率预估模型校准全流程解析

从AUC到PCOC&#xff1a;广告点击率预估模型校准全流程解析 在数字营销领域&#xff0c;点击率预估模型的准确性直接影响广告投放效果和平台收益。虽然AUC指标长期以来被用作模型性能的黄金标准&#xff0c;但它仅能评估排序能力&#xff0c;无法反映预估值与实际点击概率的匹配…...

GLM-4-9B-Chat-1M惊艳效果:1M上下文下‘反事实推理’能力边界测试

GLM-4-9B-Chat-1M惊艳效果&#xff1a;1M上下文下反事实推理能力边界测试 1. 引言&#xff1a;当AI能读完200万字&#xff0c;会发生什么&#xff1f; 想象一下&#xff0c;你面前摆着一套《三体》全集&#xff0c;大概100多万字。现在有个AI告诉你&#xff1a;我能一口气读完…...

SPIRAN ART SUMMONER步骤详解:祈祷词编写→同步率调节→唤醒祈之子全流程

SPIRAN ART SUMMONER步骤详解&#xff1a;祈祷词编写→同步率调节→唤醒祈之子全流程 1. 引言&#xff1a;从“输入提示词”到“唤醒幻光”的仪式 如果你玩过《最终幻想10》&#xff0c;一定对那个充满幻光虫和祈之子的世界印象深刻。现在&#xff0c;想象一下&#xff0c;你…...

Harness到底是什么?

一、大白话定义&#xff1a;理解Harness的底层隐喻 Harness本义为马具、缰绳&#xff0c;映射到AI领域&#xff0c;它不属于全新算法或大模型&#xff0c;而是包裹在原生大模型外层&#xff0c;用于管控智能体全链路运行的工程闭环体系。 可以用通俗逻辑对照&#xff1a; 原…...

像素特工Ostrakon-VL部署遇挫?5分钟看懂err.log定位加载失败

像素特工Ostrakon-VL部署遇挫&#xff1f;5分钟看懂err.log定位加载失败 1. 为什么需要关注err.log&#xff1f; 当你兴致勃勃地部署好像素特工Ostrakon-VL这个充满游戏感的零售场景分析工具&#xff0c;却发现Web界面一片空白或者报错时&#xff0c;第一反应可能是"哪里…...