设计模式-中介者模式
文章目录
- 一、前言
- 二、中介者模式
- 1、定义
- 2、未使用/使用中介者模式对比
- 2.1、未使用中介者模式:
- 2.2、使用中介者模式:
- 3、角色分析
- 3.1、中介者(Mediator):
- 3.2、同事(Colleague):
- 3.3、客户(Client):
- 4、中介者模式案例分析
- 4.1、中介者
- 4.2、同事
- 4.3、客户
- 5、代码示例
- 三、总结
一、前言
本文将详细介绍设计模式中的中介者模式,其中包括,中介者模式的优点、缺点、各组成部分。
二、中介者模式

1、定义
中介者模式(Mediator Pattern)是一种设计模式,它定义了一个中介者类,该类将多个对象之间的通信抽象化,使得这些对象可以通过中介者进行通信,从而降低它们之间的直接耦合度。中介者模式适用于多个对象之间存在复杂的交互关系,直接耦合会导致代码变得复杂、难以维护和扩展。
2、未使用/使用中介者模式对比
2.1、未使用中介者模式:
在没有使用中介者模式的情况下,多个对象之间可能存在直接的相互依赖,导致代码的耦合度较高。当一个对象需要与其他多个对象进行交互时,它可能需要了解这些对象的详细信息,并直接调用它们的方法,这会增加代码的复杂性和难以维护性。
2.2、使用中介者模式:
通过引入中介者模式,可以将多个对象之间的交互抽象化,降低它们之间的直接耦合度。中介者类负责协调和管理各个对象之间的通信,各个对象只需要关注自身的职责,而不必关心其他对象的实现细节。这有助于简化代码,提高可维护性和可扩展性。
在未使用中介者模式的情况下,系统的各个子系统之间直接相互依赖,子系统之间的方法可以直接相互调用。这样的系统耦合性较大,不利于系统的维护和理解。
而使用中介者模式后,子系统之间的依赖关系被打破,各个子系统都只与中介者发生依赖,而不直接与其他子系统发生依赖。这样可以将系统中各个子系统的关系解耦,降低系统的复杂性,简化系统设计和理解。同时,中介者模式的引入也可以方便系统扩展和维护,因为对于子系统的修改和增加,只需要修改或增加中介者相应的处理方法即可,不需要对其他子系统进行修改。
3、角色分析
3.1、中介者(Mediator):
中介者类负责协调和管理各个对象之间的通信。它通常包含一个或多个 Colleague 对象的引用,并提供了相应的方法来处理或转发请求。中介者类通常没有具体的业务逻辑,而是根据需要调用相应的 Colleague 对象的方法。
3.2、同事(Colleague):
同事类是与中介者类进行交互的各个对象。每个同事类通常包含一些特定的业务逻辑,并且可以通过中介者来与其他同事类进行通信。
3.3、客户(Client):
客户类是使用中介者模式的对象。它通常只需要与中介者类进行交互,而不需要直接与各个同事类进行交互。
4、中介者模式案例分析
以电商平台的订单管理系统为例,订单管理系统涉及多个角色,如订单、购物车、用户等。这些角色之间存在复杂的交互关系,例如用户添加商品到购物车后可以提交订单,购物车可以修改订单状态等。
4.1、中介者
订单管理系统可以作为一个中介者,负责协调和管理各个角色之间的通信。例如,当用户提交订单时,订单管理系统可以调用购物车和库存管理系统的相关方法来处理请求。
4.2、同事
购物车、库存管理系统、支付系统等可以作为同事类,它们具有各自的业务逻辑,并可以通过订单管理系统进行通信。例如,购物车可以修改订单状态,库存管理系统可以检查商品库存等。
4.3、客户
用户可以作为客户类,他们只需要与订单管理系统进行交互,而不需要直接与其他同事类进行交互。用户可以通过订单管理系统来查看订单状态、取消订单等。
通过引入中介者模式,可以将各个角色之间的交互抽象化,降低它们之间的直接耦合度。这有助于简化代码,提高可维护性和可扩展性。
5、代码示例
// 中介者接口
interface OrderMediator { void addItemToCart(String itemId, int quantity); void submitOrder(String userId);
} // 购物车同事类
class ShoppingCart implements Colleague { private Map<String, Integer> items = new HashMap<>(); private OrderMediator mediator; public ShoppingCart(OrderMediator mediator) { this.mediator = mediator; } @Override public void handle(String message) { if (message.startsWith("add")) { String[] parts = message.split("\\s+"); addItemToCart(parts[1], 1); } else if (message.equals("submit")) { submitOrder(getUserId()); } } private void addItemToCart(String itemId, int quantity) { items.put(itemId, items.getOrDefault(itemId, 0) + quantity); mediator.addItemToCart(itemId, quantity); } private void submitOrder(String userId) { // TODO: 提交订单的逻辑实现 System.out.println("Order submitted by user: " + userId); } private String getUserId() { // TODO: 获取用户ID的逻辑实现 return "User123"; }
} // 库存管理系统同事类
class InventorySystem implements Colleague { private Map<String, Integer> inventory = new HashMap<>(); private OrderMediator mediator; public InventorySystem(OrderMediator mediator) { this.mediator = mediator; } @Override public void handle(String message) { if (message.startsWith("check")) { String[] parts = message.split("\\s+"); checkInventory(parts[1]); } } private void checkInventory(String itemId) { int quantity = inventory.getOrDefault(itemId, 0); System.out.println("Inventory quantity for item " + itemId + ": " + quantity); }
} // 订单管理系统中介者类
class OrderMediatorImpl implements OrderMediator { private Map<String, Colleague> colleagues = new HashMap<>(); @Override public void addItemToCart(String itemId, int quantity) { Colleague colleague = colleagues.get(itemId); if (colleague != null) { colleague.handle("add " + quantity); } else { System.out.println("Item not found in the cart"); } } @Override public void submitOrder(String userId) { Colleague colleague = new ShoppingCart(this); colleagues.put(userId, colleague); colleague.handle("submit"); }
}
public class Main { public static void main(String[] args) { OrderMediator orderMediator = new OrderMediatorImpl(); Colleague shoppingCart = new ShoppingCart(orderMediator); Colleague inventorySystem = new InventorySystem(orderMediator); orderMediator.addItemToCart("item1", 2); // 将item1加入购物车,数量为2 orderMediator.submitOrder("User123"); // 提交订单,用户ID为User123 inventorySystem.handle("check item1"); // 检查item1的库存数量 }
}
三、总结
中介者模式是一种重要的设计模式,它通过引入中介者类来降低多个对象之间的直接耦合度,从而提高代码的可维护性和可扩展性。在具体应用中,我们需要根据实际需求选择合适的中介者实现方式,并在合适的场景中应用该模式。
相关文章:
设计模式-中介者模式
文章目录 一、前言二、中介者模式1、定义2、未使用/使用中介者模式对比2.1、未使用中介者模式:2.2、使用中介者模式: 3、角色分析3.1、中介者(Mediator):3.2、同事(Colleague):3.3、…...
react 大杂烩
组件 1.是返回标签的js函数,是可重复利用的UI元素 function test(){ return ( test ); } 2.构建组件: (1)export 导出组件 (2)定义函数,名称必须以大写字母开头 (3)…...
图解 STP
网络环路 现在我们的生活已经离不开网络,如果我家断网,我会抱怨这什么破网络,影响到我刷抖音、打游戏;如果公司断网,那老板估计会骂娘,因为会影响到公司正常运转,直接造成经济损失。网络通信中&…...
Kubernetes技术--k8s核心技术Controller控制器
1.Controller概述 Controller是在集群上管理和运行容器的对象。是一个实际存在的对象。 2.pod和Controller之间的关系 pod通过controller实现应用的运维,包括伸缩、滚动升级等操作。 这里pod和controller通过label标签来建立关系。如下所示: 3.Deployment控制器应用场景 -1:…...
Kubernetes技术--k8s核心技术 Secret
1.概述 Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret可以以 Volume 或者环境变量的方式使用。 作用 加密数据存储在/etc中,使得pod容器以挂载volume方式进行访问。在进行的数据存储中是以base64加密的方式…...
day27 String类 正则表达式
String类的getBytes方法 String s "腻害"; byte[] bytes s.getBytes(StandardCharsets.UTF_8); String类的new String方法 String ss "ss我的"; byte[] gbks ss.getBytes("gbk"); String gbk new String(gbks, "gbk"); String类的…...
Java设计模式:四、行为型模式-10:访问者模式
一、定义:访问者模式 访问者模式:核心在于同一个事物不同视角下的访问信息不同。 在一个稳定的数据结构下,例如用户信息、雇员信息等,增加易变的业务访问逻辑。为了增强扩展性,将两部分的业务解耦的一种设计模式。 二…...
【juc】读写锁ReentrantReadWriteLock
目录 一、说明二、读读不互斥2.1 代码示例2.2 截图示例 三、读写互斥3.1 代码示例3.2 截图示例 四、写写互斥4.1 代码示例4.2 截图示例 五、注意事项5.2.1 代码示例5.2.2 截图示例 一、说明 1.当读操作远远高于写操作时,使用读写锁让读读可以并发,来提高…...
Linux开机启动Tomcat
需求背景 Linux重启后要手动执行"startup.sh"启动Tomcat,比较麻烦,想要Linux开机启动Tomcat。 开机启动 #---------------------------------------------------------- sudo tee /usr/bin/tomcat.sh <<-EOF #! /bin/bash nohup /opt/to…...
javaweb、spring、springmvc和springboot有什么区别,都是做什么用的?
JavaWeb是一种基于Java技术的Web开发模式,用于构建动态的、可交互的Web应用程序。它是一种使用Java语言开发Web应用的技术堆栈,包括Java Servlet、JavaServer Pages(JSP)、JavaServer Faces(JSF)等。JavaWe…...
已解决module ‘pip‘ has no attribute ‘pep425tags‘报错问题(如何正确查看pip版本、支持、32位、64位方法汇总)
本文摘要:本文已解决module ‘pip‘ has no attribute ‘pep425tags‘的相关报错问题,并总结提出了几种可用解决方案。同时结合人工智能GPT排除可能得隐患及错误。并且最后说明了如何正确查看pip版本、支持、32位、64位方法汇总 😎 作者介绍&…...
Matlab(画图初阶)
目录 1.plot()函数 2. hold(添加新绘图是否保留旧绘图) 3. Plot Style 3.1 线型 3.2 标记 3.3 颜色 编辑 4. legend() 5.X 、Y and Title? 6. Text()和annotation() 7.line(创建基本线条) 7.1 基本语法 7.2 指定线条属性 7.3 更改线条属性 8.图像属性 8.1 …...
汽车自适应巡航系统控制策略研究
目 录 第一章 绪论 .............................................................................................................................. 1 1.1 研究背景及意义 ..........................................................................................…...
C语言面试题值反转字符串
知识捡漏本 1.C语言优先级 :左高于高于 右 2.定义宏函数product,调用product后,里面的i和i都是加两次1,i就是两个加2后的i相乘,i是开始的i和1后的i相乘。 3.用i (j4,k 8,m 16);这种定义方法,最终i和最后一…...
【大数据】Apache Iceberg 概述和源代码的构建
Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…...
对分库分表进行批量操作
对ShardingJDBC基础了解:https://blog.csdn.net/m0_63297646/article/details/131894472 对批量操作案例:https://blog.csdn.net/m0_63297646/article/details/131843517 分为db0和db1两个库,每个库都有三张订单表,分表键根据年份…...
大数据组件-Flume集群环境的启动与验证
🥇🥇【大数据学习记录篇】-持续更新中~🥇🥇 个人主页:beixi 本文章收录于专栏(点击传送):【大数据学习】 💓💓持续更新中,感谢各位前辈朋友们支持…...
【包过滤防火墙——iptables静态防火墙】的简单使用
文章目录 规则链的分类--五链处理的动作iptables常用参数和作用 防火墙就是堵和通的作用 iptables :包过滤防火墙,是内核防火墙netfilter的管理工具 核心:四表五链 规则链的分类–五链 在进行路由选择前处理的数据包:PREROUTIN…...
关于MySQL数据库版本不同导致表进行比较的时候报错illegal mix of collations...的问题
问题发生的原委 之前在项目开发的时候,我本地也建立了数据库用作开发库,我本地的数据库版本是5.7的,但是测试和生产库都是8.0的版本,我们定义的数据库字符集是utf8mb4,排序规则是utf8mb4_general_ci,前段时…...
进程、操作系统
文章目录 一、冯诺依曼体系(Von Neumann Architecture)1. 概述2. CPU 二、操作系统(Operating System)三、进程(process)/任务(task) 一、冯诺依曼体系(Von Neumann Architecture) 1. 概述 分类 CPU 中央处…...
紧急预警:传统ML Ops正被Agent-native ML取代!3类组织已启动迁移,你还在手动调参?
更多请点击: https://kaifayun.com 第一章:AI Agent机器学习应用的范式跃迁 传统机器学习系统通常以静态模型为中心,依赖人工特征工程、固定训练-推理流水线与离线评估闭环。而AI Agent的兴起正推动一场根本性范式跃迁:从“被动预…...
如何高效使用开源Spotify音乐下载工具:完整的实战操作指南
如何高效使用开源Spotify音乐下载工具:完整的实战操作指南 【免费下载链接】spotify-downloader Download your Spotify playlists and songs along with album art and metadata (from YouTube if a match is found). 项目地址: https://gitcode.com/gh_mirrors/…...
从账单视角看 Taotoken Token Plan 套餐带来的月度成本优化
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 从账单视角看 Taotoken Token Plan 套餐带来的月度成本优化 效果展示类,通过分享一个中型项目在采用 Taotoken 按 toke…...
从原理图到Ping通:我的STM32F407 RMII以太网调试笔记(含LAN8720硬件差异处理)
从原理图到Ping通:我的STM32F407 RMII以太网调试笔记(含LAN8720硬件差异处理) 第一次点亮STM32F407的以太网接口时,那种成就感至今难忘。但在此之前,我经历了整整两周的煎熬——原理图反复检查、PCB打样两次、软件调试…...
百度网盘Mac版破解指南:免费解锁SVIP高速下载功能
百度网盘Mac版破解指南:免费解锁SVIP高速下载功能 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘Mac版下载速度慢而烦恼吗&…...
Pandoc文档转换工具:从格式混乱到文档自由的工作流革命
Pandoc文档转换工具:从格式混乱到文档自由的工作流革命 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc 你是否曾为文档格式转换而烦恼?面对Markdown、Word、PDF、HTML等不同格式的文档…...
别再乱设边界了!HFSS中辐射边界(Radiation)与理想匹配层(PML)的实战对比与设置要点
HFSS仿真中的边界条件艺术:Radiation与PML的深度解析与实战选择 在电磁场仿真领域,边界条件的设置往往决定了模拟结果的准确性与计算效率。对于天线设计、雷达散射截面(RCS)分析等开放空间电磁问题,工程师们常常面临一个关键选择:…...
3个颠覆性技巧:让AI-HF_Patch释放游戏200%潜力的完整秘籍
3个颠覆性技巧:让AI-HF_Patch释放游戏200%潜力的完整秘籍 【免费下载链接】AI-HF_Patch Automatically translate, uncensor and update AI-Shoujo! 项目地址: https://gitcode.com/gh_mirrors/ai/AI-HF_Patch 你是否曾经下载了心仪的角色卡,却因…...
Cursor Free VIP终极指南:5步轻松实现AI编程助手永久免费使用
Cursor Free VIP终极指南:5步轻松实现AI编程助手永久免费使用 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached y…...
5分钟极速汉化:让Android Studio告别英文困扰的终极方案
5分钟极速汉化:让Android Studio告别英文困扰的终极方案 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Androi…...
