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

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式(4)--对象行为(6)--备忘录

1. 意图 在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。 这样以后可以将该对象恢复到原先保存的状态。 2. 三种角色 原发器(Originator)、备忘录(Memento)、负责人(Caretaker) 3. 优点 3.1 保持了封装边界。屏蔽了原发器的…

31.Java程序设计-基于Springboot的鲜花商城系统的设计与实现

引言 背景介绍:鲜花商城系统的兴起和发展。研究目的:设计并实现一个基于Spring Boot的鲜花商城系统。论文结构概述。 文献综述 回顾相关鲜花商城系统的设计与实现。分析不同系统的优缺点。强调Spring Boot在系统设计中的优越性。 系统设计 需求分析 用户…

Docker自建私人云盘系统

Docker自建私人云盘系统。 有个人云盘需求的人,主要需求有这几类: 文件同步、分享需要。 照片、视频同步需要,尤其是全家人都是用的同步。 影视观看需要(分为家庭内部、家庭外部) 搭建个人网站/博客 云端OFFICE需…

猫冻干哪个牌子的口碑最好?业内人士分享这五款口碑好的猫冻干

很多新手铲屎官在为自家猫咪购买猫食品时,都会非常注重成分和安全性。养了这么多年的猫,可以说,他们购买过的猫食品数量一定比大多数人都要多。自从冻干猫粮流行起来之后,很多铲屎官都开始给自家的猫咪喂冻干。冻干不仅可以作为主…

C#高级 02异步编程

基础知识 1.什么是异步任务 包含了异步任务的各种状态的一个引用类型 1)正在运行、完成、结果、报错等 2)另有ValueTask值类型版本对于异步任务的抽象 1)开启异步任务后,当前线程并不会阻塞,而是可以去做其他事情 2)异步任务(默认&#xff…

springboot返回vue id值变了

数据库里面存的616 到前端就变成了600了 后面大佬指导了下才知道是 mysql int类型太长解析不了 springboot用Long类型也不行, 换成String类型就可以了

21.仿简道云公式函数实战-数学函数-COS

1. COS函数 COS 函数可用于计算角度的余弦值,返回 -1 到 1 之间的数值。 2. 函数用法 COS(弧度) 3. 函数示例 如计算 COS(60) 的值,可设置公式为COS(RADIANS(60)),返回 0.5。 4. 代码实战 首先我们在function包下创建math包&#xff0…

Apipost-Helper使用流程

Apipost-Helper是由Apipost推出的IDEA插件,写完接口可以进行快速调试,且支持搜索接口、根据method跳转接口,还支持生成标准的API文档,注意:这些操作都可以在代码编辑器内独立完成,非常好用!这里…

码住!8个小众宝藏的开发者学习类网站

1、simplilearn simplilearn是全球排名第一的在线学习网站,它的课程由世界知名大学、顶级企业和领先的行业机构通过实时在线课程设计和提供,其中包括顶级行业从业者、广受欢迎的培训师和全球领导者。 2、VisuAlgo VisuAlgo是一个免费的在线学习算法和数…

03-JWT令牌和普通令牌的区别,JWT令牌的格式和生成

JWT令牌 普通令牌问题 普通令牌的问题: 以OAuth2的密码模式为例进行说明,客户端每次访问资源时, 资源服务都需要远程请求认证服务去校验令牌的合法性导致执行性能低 如果能够让资源服务自己校验令牌的合法性,这样就可以省去远程请求认证服务的成本并提高性能 常见…

SpringCloud(H版alibaba)框架开发教程---附源码 一

源码地址:https://gitee.com/jackXUYY/springboot-example 创建订单服务,支付服务,公共api服务(共用的实体),eureka服务 1.cloud-consumer-order80 2.cloud-provider-payment8001 3.cloud-api-commons 4.…

国标标准和行业标准使用介绍

场景 我现在所在行业是交通行业,主要做城市交通信控相关的工作,后续可能会涉及高速、收费站、稽核收费等业务场景在做产品开发时,我们需要有一个标准可以参考,这些标准必须是公认的,这时就用到了 国家标准、行业标准等…

仓储革新:AR技术引领物流进入智慧时代

根据《2022年中国物流行业研究:深度探析行业现状(智能设备及智能软件)》,报告中提及:“中国社会物流总额依然保持着较为良好的增长态势,年增速已恢复至常年平均水平。2021年社会物流总额细分中工业物流总额…

有没有什么软件可以用来线上走审批流程的?

有没有什么软件可以用来线上走审批流程的? 这就不得不提一嘴我们简道云了——因为,用简道云来搭建审批流程是特别“省”的: 省沟通:不用费心费力跟外部开发者沟通需求,自己动手做一点试一点; 省时间&…

数据通信基础知识

消息和信息、信号和数据 消息和信息 通信是在源点与终点之间传递消息或者信息。 信息和消息有着不同的概念。 消息是指能向人们表达客观物质运动和主观思维活动的文字、符号、数据、语音和图像等。它有两个特点: 能被通信双方所理解可以相互传递。 信息是指包含在消息中对通…

JOSEF约瑟 双位置继电器 DCS-12/110V 线圈电压直流110V 板前安装

系列型号: DCS-11双位置继电器; DCS-12双位置继电器; DCS-13双位置继电器; RXMVB2 RK 251 204双位置继电器; RXMVB2 RK 251 205双位置继电器; RXMVB2 RK 251 106双位置继电器; 一、用途 …

本地缓存:Caffeine入门使用

概况 回顾互联网应用发展史,可以发现一个通用并且普遍存在的一个工作过程。如下图所示,用户从浏览器发出请求 -> 网络转发请求 -> 应用服务业务处理 -> 底层存储信息获取,然后逆向的返回用户,形成页面给予用户相应信息。…

[递归回溯枚举] 装载问题

装载问题 题目描述 有一批共 n 个集装箱要装上 2 艘载重量分别为 c1和 c2的轮船,其中集装箱 i 的重量为 wi,且 装载问题要求确定,是否有一个合理的装在方案可将这 n 个集装箱装上这 2 艘轮船。如果有,找出最优装载方案。 关于输…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上,此问题概率性小,操作上面不小心打了断点… 应该是打断点的时候,打到了方法上面,去掉哟 Java Method Breakpoints

文件过大放不了U盘?三个方法非常简单~

文件过大放不了U盘我们可以从文件过大这个角度来解决一下这个问题,可以借助一些工具把文件压缩后,体积变小后,再放入U盘,使得u盘得到高效的利用,下面是推荐的一些好用的软件。 一、嗨格式压缩大师 是一款可以压缩多种…