【搞懂设计模式】中介模式:让代码更简洁,让程序更舒适!

中介模式的定义

在很多应用中,不同模块或者组件间的交互复杂且分散,这就难以管理和维护。在这种情况下,我们可以使用中介模式。在中介模式中,我们引入一个中介者对象,这个中介者就像是一个控制塔,负责处理其他对象间的通信。这样,所有的交互都被封装在中介者内部,而其他对象就无需互相知道,实现了解耦。

例子:一小时代办与通讯

让我用一个有趣的例子解释中介模式。想象一下,你正打算计划一场派对,你需要购买蛋糕,买一些饮料,然后还要订一家餐厅。 如果独自处理,你可能需要与三个完全独立的实体进行交涉。

现在,比如说有一个一小时代办服务,你只需要与其沟通,告诉他你所有的要求,然后他就会帮你搞定一切。如果你需要更改你的派对计划,你唯一需要做的只是打一通电话给这个一小时代办服务,其余的就让他来处理。

在编程中,“中介者” 就像是那个一小时代办服务, "组件"就像是买蛋糕的糕点店、提供饮料的供应商以及餐厅

// 中介者接口
interface Mediator {public void makeTransaction(Component component, String message);
}// 具体中介者
class PartyPlanner implements Mediator {@Overridepublic void makeTransaction(Component component, String message) {// Handle communication between components}
}// 具体组件
class Bakery extends Component {public Bakery(Mediator mediator){super(mediator);}// Other methods
}class DrinkSupplier extends Component {public DrinkSupplier(Mediator mediator){super(mediator);}// Other methods
}

上面的代码示例中,PartyPlanner 就是我们的 “代办服务”,它作为中介者,负责处理 BakeryDrinkSupplier 之间的通信。

中介模式的好处

中介模式主要有以下这些好处:

  1. 降低耦合度:中介模式可以使各个同事类之间的交互被独立的封装到中介者对象中,使之各个同事类无需直接交互,降低了系统的耦合度,同时中介者将各同事类分散的交互行为集中管理和控制。
  2. 提高重用性:在中介者模式中,同事类主要用来实现一些业务功能,由于它与其他同事类的交互都委托给了中介者,因此各个同事类是松散的、可复用的技术构件,它们和其他同事类或中介者之间不存在直接的依赖关系,是满足“开闭原则”的典型模式。
  3. 更易于扩展和维护:由于中介者封装了系统交互,扩展系统只需添加新的中介者和新的同事类即可,相对来说比较容易。如果系统的某个同事类发生更改,只需要调整它与中介者的交互关系即可,其他的同事类可以不修改。

犹如我们之前提及的派对规划例子,通过中介模式,我们的"一小时代办服务"(中介者)帮我们处理所有复杂的交易,我们无需与蛋糕店、饮料供应商和餐厅直接交涉,使得我们只需要专注于与一小时代办服务的交互,从而使我们的时间和精力得以有效利用。

再者,如果我们想要添加新的组件,例如一家马戏团为我们的派对表演,我们只需要将其连接到中介者上,而无需影响到其他组件。

这正是中介模式的魔力所在。但切记,任何模式都不能滥用,合理地使用,它就能帮你解决许多不必要的麻烦,让代码的可维护性大大提升。

如果我的内容能够帮到你~辛苦点一下赞或者收藏哦!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat怎么优化

目录 性能方面的优化: 安全方面的优化: 引言:面试官问到的Tomcat怎么优化,这两个方面直接得到他认可!! 性能方面的优化: 内存优化:-Xms java虚拟机初始化时的最小内存、-Xmx java虚…

C语言-qsort的使用

1. qsort()函数简介 qsort()函数是C语言库函数中的一种排序函数,排序方法为快速排序(quick sort) 。 其特点是可以排序任意类型的数组元素。 1.1 函数原型 void qsort(void* base, size_t num, size_t size, int (*co…

C++ 之LeetCode刷题记录(二十)

😄😊😆😃😄😊😆😃 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二…

CMU15-445 Project0

CMU14445 Task #1 - Copy-On-Write Trie Get()思路: 获取根节点指针,顺着key逐字符往下找节点,最后根据题意可以使用dynamic_cast检查是否是TrieNodeWithValue(dynamic_pointer_cast也可以),以下为两者用法&#xff1…

签到业务流程

1.技术选型 Redis主写入查询,Mysql辅助查询,传统签到多数都是直接采用mysql为存储DB,在大数据的情况下数据库的压力较大.查询速率也会随着数据量增大而增加.所以在需求定稿以后查阅了很多签到实现方式,发现用redis做签到会有很大的优势.本功能主要用到r…

字节8年经验之谈 —— 如何编写出色的接口测试用例?

简介:在所有的开发测试中,接口测试是必不可少的一项。有效且覆盖完整的接口测试,不仅能保障新功能的开发质量,还能让开发在修改功能逻辑的时候有回归的能力,同时也是能优雅地进行重构的前提。编写接口测试要遵守哪些原…

项目中日历管理学习使用

一些项目中会有日历或日期设置,最基本的会显示工作日,休息日,节假日等等,下面就是基于项目中的日历管理功能,要显示工作日,休息日,节假日 效果图 获取国家法定节假日工具类 public class Holi…

Go语言grpc服务开发——Protocol Buffer

文章目录 一、Protocol Buffer简介二、Protocol Buffer编译器安装三、proto3语言指南四、序列化与反序列化五、引入grpc-gateway1、插件安装2、定义proto文件3、生成go文件4、实现Service服务5、gRPC服务启动方法6、gateway服务启动方法7、main函数启动8、验证 相关参考链接&am…

msvcp140.dll丢失的解决方法

当你在尝试打开一个需要msvcp140.dll文件支持的程序或游戏时,如果系统提示该文件丢失,那么意味着在执行过程中缺少了这个关键的DLL文件。当系统无法找到或加载msvcp140.dll文件时,相应的程序将无法正常启动,这对于用户来说可能会非…

上位机图像处理和嵌入式模块部署(python opencv)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们谈到了qt,谈到了opencv,也谈到了嵌入式,但是没有说明python在这个过程当中应该扮演什么样的角色。open…

mac滚动截图

参考博客 https://www.zhihu.com/question/313673726/answer/2938671835 首先去AppStore搜索 iShot 这个也是要钱的,不过我输入appleID后,并没有扣我钱,不知道设么回事 然后打开iShot 点击观看视频,然后mac会自动打开一个新的…

JVM-字节码应用

一、字节码的应用远超你的想象 二、ASM介绍与读取字节码实战 用CoreAPI解析和TreeAPI都能做字节码解析,区别,TreeAPI必须读取完整字节码信息,才能做解析。 下面代码,使用CoreAPI做解析: package asm;public class MyM…