中介者模式的学习与使用

1、中介者模式的学习

  中介者模式是一种行为型设计模式,它通过引入一个中介者对象来解耦一组对象之间的交互。中介者模式促进了对象之间的松耦合,使得它们可以独立地进行通信,而不需要直接相互引用。
  在中介者模式中,有以下几个角色:

  • Mediator(中介者):定义了对象之间的通信接口,提供了注册、转发和通知等方法,可以协调不同对象之间的交互。
  • ConcreteMediator(具体中介者):实现了中介者接口,负责协调具体的对象之间的交互。它通常会维护一个对象的集合,用于管理对象之间的通信。
  • Colleague(同事):定义了对象之间的通信接口,通常包含一个send()方法用于发送消息,以及一个receive()方法用于接收消息。
  • ConcreteColleague(具体同事):实现了同事接口,负责向中介者发送和接收消息。

  中介者模式的核心思想是将对象之间的交互逻辑集中在中介者中,而不是让每个对象都直接与其他对象通信。当一个对象需要与其他对象进行通信时,它只需要通过中介者发送消息,而无需知道具体的目标对象。中介者负责将消息转发给合适的目标对象。
在这里插入图片描述

2、中介者模式的使用

  假设有一个聊天室程序,其中包含多个用户(User)和一个中介者(Mediator)。用户可以发送消息给其他用户,并接收其他用户发送的消息。中介者负责将用户发送的消息广播给所有其他用户。
抽象中介者

public interface Mediator {/*** 消息广播** @param user* @param message*/void messageBroadCasting(User user, String message);
}

具体中介者

public class MediatorImpl implements Mediator {private List<User> userList = Lists.newArrayList();public void registerUser(User user) {userList.add(user);}@Overridepublic void messageBroadCasting(User user, String message) {userList.stream().filter(x -> x != user).forEach(m -> m.receiveMessage(message));}
}

抽象同事

public interface User {/*** 发送消息** @param message*/void sendMessage(String message);/*** 接收消息** @param message*/void receiveMessage(String message);
}

具体同事

public class FirstUserImpl implements User {private Mediator mediator;public FirstUserImpl(Mediator mediator) {this.mediator = mediator;}@Overridepublic void sendMessage(String message) {mediator.messageBroadCasting(this, message);}@Overridepublic void receiveMessage(String message) {System.out.println(this.getClass().getSimpleName() + "接收到:" + message);}
}
public class SecondUserImpl implements User {private Mediator mediator;public SecondUserImpl(Mediator mediator) {this.mediator = mediator;}@Overridepublic void sendMessage(String message) {mediator.messageBroadCasting(this, message);}@Overridepublic void receiveMessage(String message) {System.out.println(this.getClass().getSimpleName() + "接收到:" + message);}
}
public class ThirdUserImpl implements User {private Mediator mediator;public ThirdUserImpl(Mediator mediator) {this.mediator = mediator;}@Overridepublic void sendMessage(String message) {mediator.messageBroadCasting(this, message);}@Overridepublic void receiveMessage(String message) {System.out.println(this.getClass().getSimpleName() + "接收到:" + message);}
}

客户端

public class UserClient {public static void main(String[] args) {MediatorImpl mediator = new MediatorImpl();User firstUser = new FirstUserImpl(mediator);mediator.registerUser(firstUser);User secondUser = new SecondUserImpl(mediator);mediator.registerUser(secondUser);User thirdUser = new ThirdUserImpl(mediator);mediator.registerUser(thirdUser);firstUser.sendMessage("我是第一个用户,这是我发的消息");secondUser.sendMessage("我是第二个用户,我收到了一条新消息");thirdUser.sendMessage("我是第三个用户,我收到了一条新消息");}}
SecondUserImpl接收到:我是第一个用户,这是我发的消息
ThirdUserImpl接收到:我是第一个用户,这是我发的消息
FirstUserImpl接收到:我是第二个用户,我收到了一条新消息
ThirdUserImpl接收到:我是第二个用户,我收到了一条新消息
FirstUserImpl接收到:我是第三个用户,我收到了一条新消息
SecondUserImpl接收到:我是第三个用户,我收到了一条新消息

3、总结

  中介者模式的优点包括:

  • 解耦了对象之间的交互关系,使得对象之间的通信更加灵活和可扩展。
  • 降低了对象之间的复杂性,每个对象只需要关注自身的业务逻辑。
  • 可以简化对象的维护和调试,由于对象之间的交互逻辑集中在中介者中,可以更方便地追踪和调试问题。

然而,中介者模式也有一些限制和注意事项:

  • 中介者对象会变得复杂,因为它需要管理多个对象之间的交互。
  • 过度使用中介者模式可能会导致系统的复杂性增加,使得代码难以理解和维护。
  • 中介者模式的实现可能会导致性能问题,特别是当对象之间的交互非常频繁时。

总体而言,中介者模式适用于一组对象之间存在复杂的交互关系,或者对象之间的耦合度过高的情况。通过引入中介者对象,可以将对象之间的通信逻辑抽离出来,提高系统的灵活性和可维护性。

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

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

相关文章

rabbitMq怎么查看队列消息-Tracing日志

Trace 是Rabbitmq用于记录每一次发送的消息&#xff0c;方便使用Rabbitmq的开发者调试、排错。 1、启动Tracing插件 在RabbitMQ中默认是关闭的&#xff0c;需手动开启。此处rabbitMQ是使用docker部署的 ## 进入rabbitMq中 docker exec -it rabbitmq1 bash ## 启动日志插件 rabb…

设计模式篇---建造者模式

文章目录 概念结构实例总结 概念 建造者模式的定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 这么看起来有点难以理解&#xff0c;翻译一下就是 用户无需关注创建复杂对象的过程&#xff0c;只需要指定创建的对象即…

多元回归预测 | Matlab基于粒子群算法优化深度置信网络(PSO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于基于粒子群算法优化深度置信网络(PSO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型,多变量输入模型 评价

计算机网络_ 1.3 网络核心(数据交换_电路交换_多路复用)

计算机网络_数据交换_电路交换_多路复用 多路复用频分多路复用FDM时分多路复用TDM波分多路复用WDM码分多路复用CDM 多路复用 多路复用&#xff08;Multiplexing&#xff09;&#xff0c;简称复用&#xff0c;是通信技术的基本概念。 链路/网络资源&#xff08;如带宽&#x…

浅谈数据中心机房动环监控系统可视化设计与研究

安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;为了维护好数据中心机房动力环境&#xff0c;及时发现隐患和排除故障&#xff0c;降低管理成本控制能耗&#xff0c;提高运维效率&#xff0c;保障数据中心安全、高效、环保、稳定的运行&#xff0c;针对目前机房管理…

云原生(第四篇)-k8s yaml文件

Kubernetes 支持 YAML 和 JSON 格式管理资源对象 JSON 格式&#xff1a;主要用于 api 接口之间消息的传递 YAML 格式&#xff1a;用于配置和管理&#xff0c;YAML 是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读 YAML 语法格式&#xff1a; ●大小写敏…

mysql redis区别

一、.redis和mysql的区别总结 &#xff08;1&#xff09;类型上 从类型上来说&#xff0c;mysql是关系型数据库&#xff0c;redis是缓存数据库 &#xff08;2&#xff09;作用上 mysql用于持久化的存储数据到硬盘&#xff0c;功能强大&#xff0c;但是速度较慢 redis用于存储使…

RabbitMQ的基本概念和七种队列模式

I. RabbitMQ的基本概念 1. 生产者/消费者 生产者(Producer) 消息的创建者。 负责创建和推送数据到消息服务器。 消费者(Consumer) 消息的接收方。 负责接收消息和处理数据。 2. 消息队列(Queue) 消息队列是RabbitMQ的内部对象&#xff0c;用于存储生产者的消息直到发送给消…

[SSM]MyBatis常用技巧和参数处理

目录 八、MyBatis小技巧 8.1#{}和${} 8.2别名机制&#xff1a;typeAliases 8.3mappers ​编辑 8.4IDEA配置文件模板 8.5插入数据时获取自动生成的主键 九、MyBatis参数处理 9.1单个简单参数类型 9.2Map参数 9.3实体类参数 9.4多参数 9.5Param注解&#xff08;命名…

封装一个类似微信通讯录带有字母检索功能的vue组件

这里我们直接使用scrollIntoView方法 该方法将调用它的元素滚动到浏览器窗口的可见区域 语法 element.scrollIntoView&#xff08;&#xff09;; // 等同于element.scrollIntoView(true) element.scrollIntoView&#xff08;alignToTop&#xff09;; //布尔参数 element.scro…

编译Android平台的OpenCV库并启用OpenCL及Contrib

1.下载好OpenCV与OpenCV_Contirb 版本: 4.7 编译主机系统: Ubuntu 20.04 LTS 准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE 开始编译: ../opencv/platforms/android/build_sdk.py --extra_modules_path=../opencv_contrib/modules --no_samples_bu…