【设计模式】中介者模式:设计模式中的解耦神器!!(附上demo)

Spring Event,业务解耦神器! 实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。... 阅读详情

偶然间看到了一个之前完全没有关注过的设计模式——中介者模式,在看过该设计模式的应用场景后,便有了相见恨晚的感觉啊!!!

这么屌的设计模式应该应用很广泛呀!!可怎么之前都没怎么听过?难道是我之前以为『中介者模式』==『代理模式』吗????不过话说回来,只看名字的话,很多人都会以为这两个是同一种设计模式吧……

废话不多说,我们接下来介绍下这个非常屌的设计模式。这里是demo(传送门)。

一、应用场景

『中介者模式』的设计初衷就是为了各个互相关联的模块之间的解耦。如果在业务场景中,几个模块会相互影响,那你会怎么设计程序呢?

在知道中介者模式之前,我能想到的就是回调……举个栗子,在之前做日历页开发时,日历页主要被分为五个模块:

  • PriceCalendarDelegate(日历模块)
  • MultilineDelegate(多项目模块)
  • MultiTravelDelegate(多行程模块)
  • NumberBoxDelegate(人数选择模块)
  • FooterDelegate(底部模块)

这五个模块可以说是非常紧密地关联在一起。下面是全部模块的展示图。
日历页模块效果图.jpg
当我们选中一个日期,比如4月18号时,多线路模块、多行程模块、人数选择模块都需要跟着改变。
那么我的程序是怎么写的呢?

override fun onDateSelected(dayStrObj: String, priceStr: Int?, productPrices: List<ProductPrice>?) {
        //底部模块刷新
        PriceCalendarUtil.setSuccessFetchPrice(true, mPresenter)
        mFooterDelegate?.refresh(true)
        //多线路模块刷新
        if (PriceCalendarUtil.isTour(mPresenter) && PriceCalendarUtil.isMultiLine(mPresenter)) {
            mMultiTravelDelegate?.refresh(dayStrObj, null)
            mMultiLineDelegate?.refresh(dayStrObj, productPrices)
            return
        }
        //多行程模块刷新
        if (PriceCalendarUtil.isTour(mPresenter)) {
            mMultiTravelDelegate?.refresh(dayStrObj, productPrices)
        }
        //优惠券模块刷新
        requestPriceAndCoupon(dayStrObj, priceStr)
    }

这个是选择完日期后的回调,在这个回调里,多行程模块、优惠券模块、底部模块、多线路模块都需要重新刷新。

这只是Fragment中的一个回调,由于日历页的各个模块都需要关联起来,这样的回调还有好多。红框框出来的都是回调。
这里写图片描述

二、有了中介者模式之后,我们的代码该怎么写呢?

由于日历页的代码量很大,不适合理解中介者模式的精髓,我们来写个demo。
在demo里有三个Delegate:

  • DelegateA
    这里写图片描述
  • DelegateB
    这里写图片描述
  • DelegateC
    这里写图片描述
  • BaseDelegate
    这里写图片描述
    这三个Delegate就相当于三个模块,另外BaseDelegate是它们的父类。
    除了这三个Delegate,还有一个中介者Mediator。
    这里写图片描述
    接下来只需要在Activity里初始化一下三个Delegate和一个Mediator就行了。
    这里写图片描述
    我们看到,在Activity里再也没有了那么多冗余的回调,我们可以直接在各个业务模块里去更改其他模块了!

    这样的代码层次更清晰,也更有可读性!!

    好了,读到这里如果你已经get到了『中介者模式』有多屌了,就跟我来具体了解下这个设计模式吧~~~

三、中介者模式详解

1. 定义

如果一个系统中对象之间存在多对多的相互关系,我们可以将对象之间的一些交互行为从对象中分离出来,集中封装在一个中介者对象中,由中介者同一协调。

2. 使用场景:

当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为防止在修改一个对象的行为时,同时涉及很多其他对象的行为,可使用中介者模式。

3. UML类图

这里写图片描述
这是我在网上找的一张类图。。。。由于现在已经快12点了,之后有时间再自己画一张吧。。。

四、总结

八个字概括:
模块解耦!!中介者模式!!

五、参考

https://www.cnblogs.com/ysw-go/p/5413958.html
https://blog.youkuaiyun.com/u012124438/article/details/70474166
https://blog.youkuaiyun.com/ztg1234/article/details/78359253

中介者模式简单代码 中介者模式简单代码 中介者 C# 代码 立即下载

相关推荐

Android-音频配置文件详解

前言:   Android P 引入了一种新的音频政策配置文件格式 (XML),用于描述音频拓扑。新的 XML 文件支持定义输出输入流配置文件、可用于播放和捕获的设备以及音频属性的数量和类型。但是每个项目的代码里面都有很多音频配置文件,具体使用的是哪个文件呢?本文将详细讲述。 1. 查看运行时具体使用的xml adb shell dumpsys media.audio_policy | grep -iE "Config source:" 结果如下: Config source: /vendor

cheriyou_的博客 3947

中介者模式(Mediator)

1. 定义 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 2.结构 Mediator:中介者定义一个接口用于与各同事(Colleague)对象通信。 ConcreteMediator:具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。 Colleague:抽象同事类。 Conc...

mokingone的专栏 589

Avalonia v11实战:手把手教你从零创建第一个跨平台桌面App(含设计器不显示的解决方案)

本文详细介绍了如何使用Avalonia v11从零开始创建跨平台桌面应用,包括环境准备、项目创建、界面设计及常见问题解决方案。特别针对设计器不显示等常见问题提供了实用解决方法,帮助.NET开发者快速掌握这一强大的UI框架,实现Windows、macOS和Linux多平台应用开发。

weixin_30417487的博客 164

设计模式之中介者模式

设计模式之中介者模式什么是中介者模式定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,从类图中看,共分为3部分:抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的

zhaojianyin 626

数模【Mathematica(安装、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例)】

Mathematica(安装and激活、入门方法、基本计算、基本图形、创建互动模型、利用数据、幻灯片演示、完整实例) Mathematica_11.3.0 安装教程 Mathematica11.3 激活 P1 笔记本 P2 入门方法 P3 基本计算 P4 基本图形 P5 创建互动模型 P6 利用数据 P7 演示 P8 完整实例

upward 12万+

STM32F4实战:手把手教你实现USB OTG双模式切换(Host/Slave)

本文详细介绍了如何在STM32F4上实现USB OTG双模式切换(Host/Slave),包括硬件架构解析、软件实现机制、主机模式下的U盘读写以及从机模式下的自定义设备开发。通过实战案例和优化技巧,帮助开发者快速掌握USB双角色功能,提升嵌入式系统开发的灵活性和效率。

u9v0w的博客 730

中介者模式打造多人聊天室系统

摘要: 中介者模式是一种通过引入中介对象来封装复杂对象交互的设计模式,能有效降低系统耦合度。本文以多人聊天室为例,采用《大话设计模式》的通俗风格,详细讲解了如何用C++实现该模式。系统包含四个核心角色:抽象中介者定义聊天室规则,具体中介者实现消息转发逻辑,抽象同事类规定用户基本能力,具体同事类实现用户具体行为。通过UML图和分步代码实现(从抽象角色定义到具体实现),展示了中介者模式如何简化对象间通信。最终演示了用户通过聊天室中介者发送消息的过程,验证了该模式在解耦对象交互方面的优势。

2303_79953471的博客 658

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

设计模式之中介者模式:如何通过中间层来解决耦合过多的问题?

中介者模式理解起来并不难,代码实现简单,学习难度也很小,只要合理充分地应用这个模式,往往就能够解决一些意想不到的问题。那这到底是怎样一个模式?多用于什么场景中?为什么使用?该怎么使用? 话不多说,让我们带着这些问题开始今天的学习吧。 模式原理分析 中介者模式的原始定义是:中介者对象封装了一组对象之间的交互,这组对象会将它们的交互委托给中介者对象,而不是直接交互。 可以看到,这个定义是难得的简单和明确,中介者对象就是用于处理对象与对象之间的直接交互,封装了多个对象之间的交互细节。 我们还是先来看看中介者模式的

舞鹤白沙编码日志 729

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 747

预编码算法(个人总结)

预编码算法是无线通信系统中的关键技术,通过在发送端对信号进行处理,可以有效减少干扰,提高系统性能。预编码算法在5G、Wi-Fi、卫星通信等领域具有广泛的应用前景,同时,随着深度学习、大规模MIMO和物理层安全等技术的发展,预编码算法的研究将进一步推动无线通信技术的发展。CSI的准确性直接影响到预编码的效果。预编码是一种在发送端对信号进行线性变换的技术,以优化信号的空间分布,使得接收端能够更好地接收和解码信号。预编码算法,特别是基于矩阵分解的预编码算法,计算复杂度较高,限制了其在实际系统中的应用。

年糕的博客 5288

从解耦谈设计模式

简介:    解耦其实软件设计中永恒不变的话题。“部分”设计模式诞生的原因就是为了解耦。如代理模式,工厂模式,监听者模式等。探寻设计模式的本质其实就是探寻软件解耦。  简单例子说明之:下面是“我要抓小猪”的解耦过程: 如果用编程语言 说就是构造两个类:我和小猪。这样两个类之间存在着很强的耦合关系。如图1. 现在为两个类解耦,或者你根本

shenfumin的专栏 6003

“华为杯”研究生数学建模竞赛2017年-【华为杯】B题:面向下一代光通信的 VCSEL 激光器仿真模型

得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰值向。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状。方案,包括可能的数学公式,不同温度和偏置电流下的带宽响应曲线,并与问题。线,得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状逐渐变得。得的激光器特性曲线和模型中仿真得到的特性曲线,之后,可以将两组曲线的差。说明的是,由于数值优化算法的成功与否很大程度上依赖于初始参数的猜测,参。

getusushu的博客 99

Spring Event 贼好用的业务解耦神器

实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。Spring Event(Application Event)其实就是一个观察者设计模式,一个 Bean 处理完成任务后希望通知其它 Bean 或者说一个 Bean 想观察监听另一个Bean 的行为。有些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。...

haiertadiedie的博客 211

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Spring Event,贼好用的业务解耦神器!

写在最前实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。MQ 确实可以解决这个问题,但 MQ 重啊,非必要不提升架构复杂度。针对这些问题,我们了解一下 Spring Event。Spring Event 同步使用Spring Ev...

码农code之路 168

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Spring Event 业务解耦神器

Spring Event

weixin_42073629的博客 422

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring Event 业务解耦神器,刷爆了

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT ...

芋艿V 277

Spring 发布贼好用的业务解耦神器!

大家好,我是老赵目录前言Spring Event 同步使用Spring Event 异步使用前言实际业务开发过程中,业务逻辑可能非常复杂,核心业务 + N 个子业务。如果都放到一块儿去做,代码可能会很长,耦合度不断攀升,维护起来也麻烦,甚至头疼。还有一些业务场景不需要在一次请求中同步完成,比如邮件发送、短信发送等。MQ 确实可以解决这个问题,但 MQ 重啊,非必要不提升架...

公众号-老炮说Java 173

【转】Spring Event,贼好用的业务解耦神器

spring event 实现业务解耦

魂-淡 225
上一篇: 【Android热修复与插件化 三】ClassLoader详解
下一篇: 【React Native入门系列文章 九】如何从零开始学redux?(附demo)
Colin_Mindset
博客等级 码龄12年 159粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值