关于中介模式我所知道的

简介: 关于中介模式我所知道的

image.png


设计模式 行为型

中介模式的主要目的是减少对象之间的直接交互,而是通过中介者对象来协调它们之间的交互。

目的作用


中介模式定义了一个单独的中介对象,来封装一组对象之间的交互。将这组对象之间的交互委派给与中介对象交互,来避免对象之间的直接交互。

作用和中间层很像,通过增加中介这个中间层将对象之间多对多的关系改造成一对多的关系。解除对象之间的强依赖紧耦合的关系。

对象之间不再直接进行交互,而是通过中介对象中转一下。最小化对象之间的交互关系,降低乐代码的复杂度,提高了代码的可读性和可维护性。


image.png

改造后


image.png


现实比喻


类似航空管制。

塔台可以被视为中介对象,而飞机可以被视为需要协调交互的对象。飞机起飞或降落时,塔台需要协调多个飞机之间的交通,确保它们之间不会发生碰撞或其他事故。

塔台会通过收集和处理每个飞机的相关信息,例如它们的位置、速度和方向等,来决定哪个飞机应该起飞或降落,以及它们应该采取什么行动。

在这个过程中,飞机不直接相互通信,而是通过塔台来进行协调。塔台拥有对所有飞机的引用,并负责协调它们之间的交互,从而保证了航空领域的安全和顺畅。

回归到日常业务中,用不用中介模式的区别就在于 原本业务逻辑会分散在各个控件中,现在都集中到了中介对象中。虽然简化了控件之间的交互,但是可能会使中介对象变成庞大复杂的“上帝类”。所以,在使用中介模式的时候,我们要根据实际的情况,平衡对象之间交互的复杂度和中介类本身的复杂度。


代码实现

案例 1


image.png


改造后


image.png


案例 2


image.png


改造后


image.png


适用场景


适用于需要协调和控制多个对象之间的复杂交互的场景。


通过将交互逻辑封装在中介者对象中,可以更好地控制对象之间的耦合度,从而提高系统的可维护性和可扩展性。

场景关键词举例:

  • 简化对象之间的耦合关系
  • 当一个对象需要协调多个其他对象之间的交互时
  • 当一个对象需要向多个对象发送通知或消息时
  • 当一个对象需要与多个对象进行交互,并且这些对象的数量和类型不固定时
  • 当一个对象需要与其他对象进行交互,并且这些对象都需要知道该对象的状态或行为时

与其他设计模式的区别

中介模式与观察者模式的区别

中介模式和观察者模式都是用来协调多个对象之间的交互,但实现方式不同。 中介模式中,所有对象都是和中介者对象交互,而中介者对象负责将信息传递给其他对象; 而观察者模式中,被观察对象与观察者对象之间是直接交互的,被观察对象负责将信息通知给观察者对象。

在观察者模式的应用场景中,参与者之间的交互关系比较有条理,而中介模式正好相反。 只有当参与者之间的交互关系错综复杂,维护成本很高的时候,我们才考虑使用中介模式。 除此之外,如果一个参与者状态的改变,其他参与者执行的操作有一定先后顺序的要求。这个时候中介模式就可以利用中介类,通过先后调用不同参与者的方法,来实现顺序的控制,而观察者模式是无法实现这样的顺序要求的。


中介模式与适配器模式的区别


中介模式和适配器模式都是用来解决对象之间的兼容性问题,但它们的解决方式不同。中介模式中,中介者对象负责将不同对象之间的接口进行转换,使它们能够相互协作;而适配器模式中,适配器对象负责将一个对象的接口转换成另一个对象所期望的接口。


中介模式与装饰器模式的区别


中介模式和装饰器模式都是用来扩展对象的功能,但它们的扩展方式不同。中介模式中,中介者对象通过协调对象之间的交互来扩展对象的功能;而装饰器模式中,装饰器对象通过包装其他对象来扩展对象的功能。


中介模式与代理模式的区别


中介模式和代理模式都是用来控制对象之间的访问,但它们的控制方式不同。中介模式中,中介者对象负责控制对象之间的交互,从而控制对象的访问;而代理模式中,代理对象负责控制对实际对象的访问,从而控制对象的访问。

目录
相关文章
|
存储 JSON 搜索推荐
ISV
ISV(独立软件供应商)是一种为其他公司或个人提供软件产品或服务的公司。ISV 通常专注于开发和销售特定的软件解决方案,以满足客户的需求。ISV 可以提供各种类型的软件,包括桌面应用程序、Web 应用程序、移动应用程序、游戏等。
989 1
ISV
|
7月前
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
221 0
|
NoSQL Redis
Redis下Lua脚本的复制模式
假设我们的Redis选择了主从架构, 和AOF持久化方式。我们执行一条写命令时, 该条命令会被发送到从服务器, 和追加到AOF文件中。当我们执行的不是一条命令, 而是Lua脚本时, 默认情况下, 整个Lua脚本的内容会进行复制, 但是存在一些特殊情况。
2501 0
Redis下Lua脚本的复制模式
|
消息中间件 存储 运维
云消息队列 Kafka 版全面升级:经济、弹性、稳定,成本比自建最多降低 82%
本文介绍了阿里云云消息队列 Kafka 版的全面升级,强调了其在经济性、稳定性和弹性方面的显著提升。同时,与 Apache Kafka 相比,云消息队列 Kafka 版通过节省 66% 的资源,实现了客户使用成本比自建最多降低 82%。
589 101
|
存储 编解码 网络协议
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
前几年,我们在做Android平台GB28181设备接入模块的时候,第一个使用场景想到的就是用在公检法应急指挥等场景下的执法记录仪,本篇blog,我们主要围绕Android平台GB28181执法记录仪的硬件选型、设备接入、音视频流配置、流媒体传输、存储和管理、控制与控制中心等方面进行设计,探讨下Android平台GB28181设备接入模块在执法记录仪行业的应用。
348 1
Android平台GB28181执法记录仪硬件选型和国标技术实现探讨
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
598 1
springboot的缓存和redis缓存,入门级别教程
|
物联网 测试技术 Go
阿里云EMAS移动测试最佳实践|马来西亚第一大电子钱包通过EMAS测试提效6倍
阿里云EMAS移动测试与Touch'n Go eWallet的合作是EMAS移动研发产品“出海”的良好开端。目前为止,EMAS移动测试已服务国内外数以千计的企业,沉淀了丰富的企业移动数字化转型方案与经验。在未来,EMAS会持续为企业移动应用APP质量保驾护航,为更多像Touch‘n Go eWallet这样的优质客户提供各类高品质的移动研发服务。
1366 1
阿里云EMAS移动测试最佳实践|马来西亚第一大电子钱包通过EMAS测试提效6倍
|
存储 Java 数据库连接
【Spring传播机制底层原理】
【Spring传播机制底层原理】
235 0
|
机器学习/深度学习 缓存 算法
缓存读写淘汰算法W-TinyLFU算法
缓存读写淘汰算法W-TinyLFU算法
516 0
关于Spring Cloud Gateway与下游服务器的连接分析
背景 最近面试了不少同学,有很大一部分简历上会提到网关,我一般都会顺着往下问他们的网关是怎么做的。 基本上都是说直接使用的Spring Cloud Gateway或者基于Spring Cloud Gateway二次开发。 这种时候我会继续问一个比较基础的问题:Spring Cloud Gateway作为网关,会把接收到的请求转发给下游服务,那么Spring Cloud Gateway跟下游的服务之间保持的是长连还是短连?还是说每次转发的时候都会新建立一个连接吗?