java设计模式学习之【中介者模式】
文章目录
- 引言
- 中介者模式简介
- 定义与用途
- 实现方式
- 使用场景
- 优势与劣势
- 在Spring框架中的应用
- 聊天室示例
- 代码地址
引言
想象一下一座忙碌的机场,各种飞机需要起飞、降落,而不同的飞行活动之间必须互不干扰。如果没有一个统一的控制系统,这将是一场混乱。空中交通控制塔(ATC)作为中介者,协调各个飞机的活动,确保一切有序进行。在软件开发中,我们也经常遇到多个对象需要相互通信和协调的情况,中介者模式为这种复杂的通信和控制提供了一种简单明了的解决方案。
中介者模式简介
定义与用途
中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个第三方对象(中介者)来管理一组对象之间的复杂交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,并且可以独立地改变它们之间的交互。
实现方式
实现中介者模式通常涉及以下几个关键组件:
- 中介者接口(Mediator):定义了同事对象到中介者对象的接口,用于各同事对象通知中介者。
- 具体中介者(Concrete Mediator):实现中介者接口,并协调各同事对象之间的交互。
- 同事类(Colleague):所有同事类的接口。每个同事只知道自己的行为,而不了解其他同事的情况,但它们知道中介者。
使用场景
中介者模式适用于以下场景:
- 当一组对象之间的通信方式复杂混乱时。
- 当需要一个对象来管理这些交互,并使其互不依赖时。
- 当你想定制一个分布在多个类中的行为,而又不想生成太多的子类时。
例如:
- 聊天室:聊天室作为中介者,协调多个用户(同事)之间的消息传递。
- GUI中的窗口系统:窗口或对话框作为中介者,协调各种GUI组件(按钮、文本框、列表等)之间的交互。
- 航班调度系统:调度中心作为中介者,管理多个航班的起降和空中路径。
优势与劣势
- 优势
减少了类之间的依赖,降低了耦合度。
将一对多的依赖转化为一对一的依赖,提高了系统的可维护性。
中心化的控制交互逻辑,使其易于理解和修改。 - 劣势
中介者本身可能变得过于复杂,集中了过多的逻辑。
在Spring框架中的应用
在Spring框架中,虽然不常直接提到中介者模式,但是许多Spring的核心概念和组件实际上体现了中介者模式的精神。中介者模式的核心思想是通过一个中介对象来封装一系列对象之间的交互,使对象之间不需要显式地相互引用,从而使其耦合松散,而Spring框架恰恰提倡控制反转和依赖注入来实现松耦合。
以下是Spring框架下体现中介者模式思想的几个方面:
1. Spring容器作为中介者
在Spring中,容器(如ApplicationContext)充当中介者的角色,管理应用对象(Bean)的整个生命周期。容器负责创建Bean、注入依赖、配置Bean以及管理它们的生命周期。Bean之间不需要知道对方的存在,它们只通过配置文件或注解声明依赖,由Spring容器来负责具体的依赖注入工作。2. Spring MVC中的DispatcherServlet
在Spring MVC框架中,DispatcherServlet充当中介者的角色,负责协调各种Controller、Service、和View之间的交互。它接收请求,委托给适当的处理器,然后再将模型数据传递给视图进行渲染。在这个过程中,DispatcherServlet确保各个组件相互之间的解耦和协调。3. 事件发布和监听
Spring的事件发布-监听机制也是中介者模式的一个体现。在这种机制中,应用可以发布各种事件,而监听器可以监听这些事件。Spring的ApplicationEventPublisher充当中介者,管理事件的发布和监听器的通知。这种方式实现了事件发布者和监听者之间的松耦合。4. JdbcTemplate和TransactionTemplate
Spring提供了一系列的模板,比如JdbcTemplate和TransactionTemplate,它们封装了对JDBC操作和事务管理的常见模式。这些模板类充当中介者的角色,管理数据库连接、语句的执行以及事务的边界,用户只需要提供具体的SQL和代码逻辑。
尽管这些组件和机制不是传统意义上的中介者模式,但它们体现了中介者模式背后的核心原则:封装对象之间的交互,提供一个统一的接口来协调各个组件或服务的行为。通过这种方式,Spring框架显著降低了组件之间的耦合度,并提高了整体的灵活性和可维护性。
聊天室示例

步骤 1:创建中介者类
import java.util.Date;public class ChatRoom {public static void showMessage(User user, String message){System.out.println(new Date().toString() + " [" + user.getName() + "] : " + message);}
}
ChatRoom 充当中介者角色,提供一个静态方法 showMessage 来展示用户的消息。这个方法打印了消息的时间、发送者和内容。
步骤 2:创建用户类
public class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name){this.name = name;}public void sendMessage(String message){ChatRoom.showMessage(this, message);}
}
User 类代表聊天室的用户。每个用户有一个名字,并且可以通过 sendMessage 方法来发送消息。当用户发送消息时,它实际上是调用了中介者 ChatRoom 的 showMessage 方法。
步骤 3:展示用户间的通信
public class MediatorPatternDemo {public static void main(String[] args) {User robert = new User("Robert");User john = new User("John");robert.sendMessage("Hi! John!");john.sendMessage("Hello! Robert!");}
}

在这个演示类中,我们创建了两个用户 Robert 和 John。然后我们让这两个用户相互发送消息。每当用户发送消息时,实际上是通过 ChatRoom(作为中介者)来显示消息的。
这个示例演示了中介者模式如何在软件设计中用于简化多个对象之间的通信。通过将对象之间的通信封装到一个中介者对象中,可以降低对象之间的直接交互,减少系统的复杂性,提高可扩展性和可维护性。
代码地址
23种设计模式相关代码后续会逐步提交到github上,方便学习,欢迎指点:
代码地址
https://github.com/RuofeiSun/lf-23Pattern
相关文章:
java设计模式学习之【中介者模式】
文章目录 引言中介者模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用聊天室示例代码地址 引言 想象一下一座忙碌的机场,各种飞机需要起飞、降落,而不同的飞行活动之间必须互不干扰。如果没有一个统一的控制系统,这将是一…...
C++三剑客之std::variant(一)
1简介 C17的三剑客分别是std::optional, std::any, std::vairant。今天主要讲std::variant。std::variant的定义如下: template< class... Types > class variant; 类模板 std::variant 表示一个类型安全的联合体(以下称“变化体”)…...
新火种AI|AI正在让汽车成为“消费电子产品”
作者:一号 编辑:小迪 AI正在让汽车产品消费电子化 12月28日,铺垫许久的小米汽车首款产品——小米SU7正式在北京亮相。命里注定要造“电车”的雷军,在台上重磅发布了小米的五大自研核心技术。在车型设计、新能源技术以及智能科技…...
Docker六 | Docker Compose容器编排
目录 Docker Compose 基本概念 使用步骤 常用命令 Docker Compose Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Compose可以管理多个Docker容器组成一个应用。 需要定义一个YAML格式的配置文件docker-compose.yml,…...
Oraclelinux部署Oracle服务
采用图形化界面 user用户 oracle用户 #清屏 clear #设置主机名 hostnamectl set-hostname ceshidb sed -i 1,2 s/^/#/ /etc/hosts echo "127.0.0.1 ceshidb" >> /etc/hosts echo "::1 ceshidb" >> /etc/hosts ping -c 5…...
Ubuntu安装K8S(1.28版本,基于containrd)
原文网址:Ubuntu安装K8S(1.28版本,基于containrd)-CSDN博客 简介 本文介绍Ubuntu安装K8S的方法。 官网文档:这里 1.安装K8S 1.让apt支持SSL传输 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certi…...
Linux 线程安全 (2)
文章目录 线程同步概念条件变量使用生产消费模型信号量的使用读写锁的使用 Linux 线程安全 (1) 线程同步概念 竞态条件:因为时序问题,而导致程序异常. 饥饿问题:只使用互相锁保证线程安全时,锁资源总被某…...
异或运算^简述
异或运算:^ 两个变量之间异或运算时,其二进制位相同取0,不同取1. 示例:a10 (0b 0000 1010) b3 (0b 0000 0011) a^b9(0b 0000 1001) 据此可以推算异或运算"^"有以下特性: a^a0 (0b 0000 0000)…...
Google Play上架:2023年度总结报告
今天是2023年的最后一个工作日,今天用来总结一下2023年关于谷歌商店上架的相关政策改动和对应的拒审解决方法。 目录 政策更新与改动2023 年 2 月 22 日2023 年 4 月5 日2023 年 7 月 12 日2023 年 10 月 25 日 开发者计划政策拒审邮件内容和解决办法 政策更新与改…...
JAVA进化史: JDK10特性及说明
DK 10(Java Development Kit 10)是Java平台的一个版本,于2018年3月发布。尽管相对于之前的版本,JDK 10的变化较为温和,但仍然引入了一些新特性和改进,以下是其中一些主要特性,并带有相应的示例说…...
第二百三十四回
文章目录 1.概念介绍2.使用方法2.1 NumberPicker2.2 CupertinoPicker 3.示例代码4.内容总结 我们在上一章回中介绍了"如何在任意位置显示PopupMenu"相关的内容,本章回中将介绍如何实现NumberPicker.闲话休提,让我们一起Talk Flutter吧。 1.概念…...
{MySQL} 数据库约束 表的关系 新增删除 修改 查询
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、数据库约束1.1约束类型:1.2 NULL约束1.3unique 唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN K…...
【JVM】虚拟机的组成+字节码文件组成+类的生命周期
什么是JVM? JVM 本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件。 JVM的功能 1.解释和运行:对字节码文件中的指令实时的解释成机器码让计算机执行。 2.内存管理:自动为对象、方法等分配内存,自动…...
pip 下载太慢的解决办法,pip换国内源,pip换源
用pip安装python包的时候,如果系统没有进行相关设置,则用的源服务器是国外的,在国内访问非常慢,我们需要换成国内的源服务器,pip换源通过如下命令: pip config set global.index-url <源地址> 一、…...
OKCC语音机器人的人机耦合来啦
目前市场上语音机器人的外呼形式基本就分为三种,一种纯AI外呼,第二种也是目前主流的AI外呼转人工。那么第三种也可能是未来的一种趋势,人机耦合,或者也叫人机协同。 那么什么是人机耦合呢? 人机耦合是为真人坐席创造相…...
有序数组的平方
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 示例 1: 输入:nums [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 …...
Java虚拟机中的垃圾回收
2 垃圾回收 2.1 判断一个对象是否可回收 2.1.1 引用计数法 如果一个对象被另一个对象引用,那么它的引用计数加一,如果那个对象不再引用它了,那么引用计数减一。当引用计数为 0 时,该对象就应该被垃圾回收了。 但是下面这种互相…...
Vscode新手安装与使用
安装与版本选择 VS Code 有两个不同的发布渠道:一个是我们经常使用的稳定版(Stable),每个月发布一个主版本;另外一个发布渠道叫做 Insiders,每周一到周五 UTC 时间早上6点从最新的代码发布一个版本&#x…...
以元旦为题的诗词(二)
都放假了吧,都有空了吧,可坐下来好好学学诗词,好好写些诗词了吧,我先来几首,你实在不行,去百度或者小程序搜索《美诗计》写一写 元旦 去年元日落寒灰,今岁清明在此杯 老眼看书如梦寐ÿ…...
饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜
饥荒Mod 开发(二十):显示打怪伤害值 饥荒Mod 开发(二二):显示物品信息 源码 游戏中的物品栏容量实在太小了,虽然可以放在箱子里面但是真的很不方便,外出一趟不容易看到东西都不能捡。实在是虐心。 游戏中的食物还有变质机制,时间长了就不能吃了,玩这个游戏心里压力真是太…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统
目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索(基于物理空间 广播范围)2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...
