设计模式第18讲——中介者模式

目录

一、什么是中介者模式

二、角色组成

三、优缺点

四、应用场景

4.1 生活场景

4.2 java场景

五、代码实现

5.0 代码结构

5.1 抽象中介者(Mediator)——LogisticsCenter

5.2 抽象同事类(Colleague)——Participant

5.3 具体同事类(Concrete Colleague)——TransportCompany&Merchant

5.4 具体中介者(Concrete Mediator)——LogisticsCenterImpl

5.5 testMediator

六、总结


一、什么是中介者模式

中介者模式是一种行为型设计模式,它用于减少对象之间互相通信的复杂性。中介者模式通过创建一个中介者对象,将对象之间的通信集中交给该对象来处理,而不是直接相互交流,是符合迪米特原则的典型应用。
迪米特原则:减少对象之间的依赖,即一个对象应当对其它对象有尽可能少的了解

二、角色组成

  • 抽象中介者(Mediator):用于协调各个同事对象之间交互的通用接口,如接收和发送消息等。
  • 具体中介者(Concrete Mediator):实现抽象中介者接口,定义一个List来管理同时对象,协调各个同事对象之间的交互,依赖于同事角色。
  • 抽象同事类(Colleague):保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类(Concrete Colleague):实现抽象同事类接口,当需要与其他同事对象交互时,由中介者对象负责后续的交互,简单地说就是维护和中介者对象的通信。

三、优缺点

优点:

  • 减少对象之间的耦合度,使其变得简单易维护。
  • 提高代码的重用性和可扩展性,增强了系统的灵活性和可维护性。
  • 降低了类的复杂度,将一对多转化成了一对一。

缺点:

  • 中介者对象通常具有较高的复杂性,难以实现。
  • 当对象之间的交互较少或简单时,中介者模式可能会增加系统的一些不必要的复杂性。
  • 随着系统的扩大,中介者模式的复杂度可能会增加,使得代码难以维护。

四、应用场景

4.1 生活场景

  • 物流公司:通常作为中介者来协调包裹和货物的运输、仓储和投递等工作,同时保证货物的质量和安全,提高物流效率和服务水平。
  • 某宝:管理各个商家和用户之间的交易信息,负责物流、支付等方面的处理,同时收取一定的手续费。
  • 论坛和社交网络:处理用户之间的交流、分享和反馈等信息,同时处理违规信息和言论。

eg:只要是需要协调各方之间的合作和交互的领域,都有可能会涉及到中介者模式。

4.2 java场景

  •  MVC架构:MVC架构中的控制器(Controller)部分,负责协调模型(Model)和视图(View)之间的交互。
  • SPring:Spring框架中的事件机制和发布/订阅模式,通过应用程序上下文(Application Context)作为中介者,不同的组件可以通过事件监听器和发布者-订阅者模式进行交互。
  • 消息队列:消息队列是一个典型的使用中介者模式的例子,消息队列系统中的中介者负责接收、存储和分发消息。

五、代码实现

下面以物流公司协调运输公司和商家为例,解释一下中介者模式。 在物流公司中,中介者是一个"物流中心",表示用于协调和管理各个参与方(货主、运输公司、客户等)之间的交互关系。

5.0 代码结构

 

5.1 抽象中介者(Mediator)——LogisticsCenter

/*** @author Created by njy on 2023/6/27* 1.抽象中介者(Mediator):物流中心* 定义:用于协调各个同事对象之间交互的通用接口*/
public interface LogisticsCenter {// 参与方注册方法,用于新增参与方void register(Participant participant);// 发送信息方法,用于同事之间的信息传递void send(String from, String to, String message);
}

5.2 抽象同事类(Colleague)——Participant

/*** @author Created by njy on 2023/6/27* 2.抽象同事类(Colleague):参与者(同事)* 定义:保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。*/
public abstract class Participant {// 中介者对象protected final LogisticsCenter logisticsCenter;public Participant(LogisticsCenter logisticsCenter) {this.logisticsCenter = logisticsCenter;}// 消息发送方法,根据传递给中介者public abstract void send(String to, String message);// 消息接收方法,由中介者调用public abstract void receive(String message);
}

5.3 具体同事类(Concrete Colleague)——TransportCompany&Merchant

/*** @author Created by njy on 2023/6/27* 3.具体同事类(Concrete Colleague):运输公司* 定义:实现抽象同事类接口,当需要与其他同事对象交互时,* 由中介者对象负责后续的交互,简单地说就是维护和中介者对象的通信。*/
public class TransportCompany extends Participant{public TransportCompany(LogisticsCenter logisticsCenter) {super(logisticsCenter);}// 消息发送方法的实现,发送信息给中介者对象@Overridepublic void send(String to, String message) {logisticsCenter.send("运输公司", to, message);}// 消息接收方法的实现,打印接收信息的内容@Overridepublic void receive(String message) {System.out.println("运输公司接到消息: " + message);}
}
/*** @author Created by njy on 2023/6/27* 3.具体同事类(Concrete Colleague):商家* 定义:实现抽象同事类接口,当需要与其他同事对象交互时,* 由中介者对象负责后续的交互,简单地说就是维护和中介者对象的通信。*/
public class Merchant extends Participant{public Merchant(LogisticsCenter logisticsCenter) {super(logisticsCenter);}// 消息发送方法的实现,发送信息给中介者对象@Overridepublic void send(String to, String message) {logisticsCenter.send("商家", to, message);}// 消息接收方法的实现,打印接收信息的内容@Overridepublic void receive(String message) {System.out.println("商家接收到消息: " + message);}
}

5.4 具体中介者(Concrete Mediator)——LogisticsCenterImpl

/*** @author Created by njy on 2023/6/27* 4.具体中介者(Concrete Mediator):物流公司* 定义:实现抽象中介者接口,定义一个List来管理同时对象,*      协调各个同事对象之间的交互,依赖于同事角色。*/
public class LogisticsCenterImpl implements LogisticsCenter{// 参与方列表,用于管理同事之间的交互关系private final Map<String, Participant> participants = new HashMap<>();// 参与方注册方法的实现,向同事列表中添加参与方@Overridepublic void register(Participant participant) {participants.put(participant.getClass().getSimpleName(), participant);}// 发送信息方法的实现,根据接收方信息调用接收方的消息接收方法@Overridepublic void send(String from, String to, String message) {Participant participant = participants.get(to);if (participant != null) {participant.receive("Message from " + from + ": " + message);}}
}

5.5 testMediator

/*** @author Created by njy on 2023/6/28* 中介者模式测试类*/
@SpringBootTest
public class TestMediator {@Testvoid testMediator(){//创建物流中心对象LogisticsCenter logisticsCenter = new LogisticsCenterImpl();//运输公司TransportCompany company = new TransportCompany(logisticsCenter);//商家Merchant merchant = new Merchant(logisticsCenter);//都注册到物流中心logisticsCenter.register(company);logisticsCenter.register(merchant);//发送消息给物流公司(中介者)company.send("Merchant", "快递已送达");merchant.send("TransportCompany", "收到,幸苦了");}
}

 

六、总结

当出现以下情况,可以考虑使用中介者模式:

  • 如果对象之间的交互关系复杂且难以维护,或者对象之间需要大量的相互调用和信息传递,可以考虑使用中介者模式来简化对象之间的通信和协调。
  • 如果对象之间紧密耦合,修改一个对象可能会影响到其他相关对象,使得系统难以进行扩展和维护。使用中介者模式可以降低对象之间的耦合度,使得对象可以独立变化和复用。
  • 当系统中存在一个有组织结构的集合,并且该集合中的对象之间需要相互通信和协作时。比如,一个群聊系统中的参与者之间需要进行信息传递和交流,此时可以使用中介者模式来管理参与者之间的通信。
  • 当需要集中化管理和控制一些公共行为或操作时。中介者模式可以充当一个中心协调者,负责管理和调度相关对象的行为或操作。例如,在一个电梯控制系统中,电梯调度器扮演中介者的角色,控制电梯的运行和调度。

总结一下,中介者模式可以有效地降低对象之间的耦合度,简化对象之间的交互。适用于对象之间的关系非常复杂,需要协调处理的情况,从而提高代码的可维护性和可扩展性。但是,如果应用不当,可能会使得系统的复杂度增加,不利于代码的维护和扩展。因此,在使用中介者模式时需要掌握适当的使用场景。

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

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

相关文章

搭建SpringBoot项目 详细教程

一、搭建SpringBoot项目 这个项目&#xff0c;可以作为种子项目&#xff0c;我打算把它放置Gitee上。包含大部分web开发的相关功能&#xff0c;后期所有的Spring Boot项目都可以用这个项目&#xff0c;简单修改一下配置&#xff0c;就可以快速开发了。 选择Spring initializr…

uniapp 开发小程序之实现不同身份展示不同的 tabbar(底部导航栏),附带相关问题解答

效果展示&#xff1a; 引言 在开发过程中逐渐意识到uniapp原生的tabbar可能不能满足开发要求&#xff0c;通过浏览博客才选择使用uView的Tabbar 底部导航栏来实现&#xff0c;我选择用的是2X版本 安装 我是使用Hbuilder插件的方式引入的组件库&#xff0c;安装配置可以看这篇…

【用户认证】密码加密,用户状态保存,cookie,session,token

相关概念 认证与授权 认证&#xff08;authentication &#xff09;是验证你的身份的过程&#xff0c;而授权&#xff08;authorization&#xff09;是验证你有权访问的过程 用户认证的逻辑 获取用户提交的用户名和密码根据用户名&#xff0c;查询数据库&#xff0c;获得完…

【DBA专属】MHA高可用数据库集群-----------一主一备两从一管理,一个VIP客户端

MHA高可用数据库集群 目录 环境配置&#xff1a; 所有操作系统均为centos 7.x 64bit 1、关闭防火墙&#xff1a;&#xff08;所有服务器&#xff09; 2.配置所有主机名映射&#xff08;所有服务器&#xff09; 3、同步时区 4.安装MHA node及相关perl依赖包&#xff08;所有…

使用HHDESK图形化功能管理服务器

服务器的管理通常繁琐而枯燥&#xff0c;需要大量的命令行来执行。 所以图形化功能应运而生。 本篇以传输文件为例&#xff0c;简单介绍一下HHDESK的图形化管理功能。 首先需要配置好服务器。 点击连接管理&#xff0c;在连接类型中选择SSH&#xff0c;按照刚才在服务器中配…

Android应用程序开发需要哪些编程语言?

开发一款Android上的应用程序通常需要以下编程语言&#xff1a; Java&#xff1a;Java是Android开发的主要编程语言。几乎所有的Android应用程序都使用Java进行核心开发。你可以使用Java编写应用程序的业务逻辑、界面设计和数据处理等。 刚好我这里有嵌入式、plc、单片机的资料…

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转发自CSDN远程穿透的文章&#xff1a;【…

哈工大计算机网络课程网络层协议详解之:DHCP协议

哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议 文章目录 哈工大计算机网络课程网络层协议详解之&#xff1a;DHCP协议如何获得IP地址&#xff1f;硬编码动态主机配置协议-DHCP&#xff1a;&#xff08;Dynamic Host Configuration Protocol&#xff09; 动态主机配…

Docker学习笔记1

PaaS&#xff1a; 一、虚拟化分类&#xff1a; 虚拟化资源提供者&#xff1a; 1&#xff09;硬件平台虚拟化 2&#xff09;操作系统虚拟化 虚拟化实现方式&#xff1a; type I: 半虚拟化 type II&#xff1a;硬件辅助全虚拟化 type III&#xff1a; 软件全虚拟化&#xff1a; …

【②MySQL 】:测试数据准备、SQL语句规范与基本操作

前言 欢迎来到小K的MySQL专栏&#xff0c;本节将为大家准备MySQL测试数据、以及带来SQL语句规范、数据库的基本操作的详细讲解~✨文末送书&#xff0c;小K赠书活动第二期 目录 前言一、准备测试数据二、SQL语句规范三、数据库的基本操作四、总结&#xff1a;文末赠书 一、准备测…

影响远程访问性能的潜在因素

对企业和远程办公人员而言&#xff0c;远程访问技术非常关键。因为通过这项技术&#xff0c;员工可以随时随地使用任意设备工作&#xff0c;可以提高生产力和灵活性。 但是&#xff0c;远程访问性能可能会受到多种因素的影响。这篇文章将介绍影响远程访问性能的各种潜在因素&a…

弟子规 古译今 详解

博主 默语带您 Go to New World. ✍ 个人主页—— 默语 的博客&#x1f466;&#x1f3fb; 《java 面试题大全》 &#x1f369;惟余辈才疏学浅&#xff0c;临摹之作或有不妥之处&#xff0c;还请读者海涵指正。☕&#x1f36d; 《MYSQL从入门到精通》数据库是开发者必会基础之…