二十三种设计模式全面解析-解放组件间的通信束缚:深入探讨中介者模式的高级应用和进阶技巧

本文主要是介绍二十三种设计模式全面解析-解放组件间的通信束缚:深入探讨中介者模式的高级应用和进阶技巧,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


在软件开发中,组件之间的通信往往是不可避免的。然而,随着系统规模的增大和组件之间的相互依赖关系复杂化,直接的组件间通信往往会导致代码耦合度过高、可维护性下降等问题。为了解决这些问题,中介者模式应运而生。中介者模式通过引入一个中介者对象,将组件间的通信转变为间接的方式,从而降低了组件间的耦合度,提高了系统的灵活性和可维护性。


中介者模式在简化组件间通信、解耦依赖关系方面发挥着重要作用,但在实际应用中,我们还可以进一步提升其灵活性和可扩展性。本文将介绍中介者模式的高级应用和进阶技巧,包括事件驱动的中介者、中介者链和中介者的动态切换。


1. 事件驱动的中介者

传统的中介者模式中,组件之间的通信是通过中介者直接调用组件的方法来实现的。然而,在复杂的系统中,组件之间的通信可能涉及多个事件和动作,直接的方法调用方式显得不够灵活。事件驱动的中介者模式通过引入事件机制,使得组件之间的通信更加灵活和扩展。


在事件驱动的中介者模式中,组件之间不直接调用对方的方法,而是将事件发送给中介者,由中介者根据事件的类型和内容来触发相应的动作。这样,组件只需关注自身的事件处理逻辑,而无需了解其他组件的细节。
事件驱动的中介者模式可以提高系统的可扩展性和灵活性。当系统需要新增组件或修改组件间的通信逻辑时,只需通过定义新的事件和相应的处理逻辑,而无需修改已有的组件代码。

2. 中介者链

在某些情况下,系统中可能存在多个中介者,每个中介者负责不同领域或不同模块的组件间通信。此时,可以使用中介者链来实现多个中介者之间的协作。


中介者链是一种将多个中介者连接起来的方式,使得消息可以在中介者之间传递。当组件发送消息时,消息将依次传递给中介者链中的下一个中介者,直到到达目标组件。这样,不同领域或模块的组件可以通过中介者链进行通信,同时保持彼此的独立性。


中介者链可以提高系统的可扩展性和灵活性。当系统需要新增中介者或修改中介者之间的关系时,只需调整中介者链的配置,而无需修改已有的组件代码。


3. 中介者的动态切换

在某些情况下,系统需要根据不同的条件或场景切换中介者。例如,系统在不同的工作模式下可能需要使用不同的中介者来处理组件间的通信。


中介者的动态切换可以通过引入抽象工厂模式或配置文件来实现。通过抽象工厂模式,可以定义一个中介者工厂接口和多个具体的中介者工厂,根据条件或配置来动态创建不同的中介者。而通过配置文件,可以在运行时读取配置信息,选择合适的中介者实例进行使用。


中介者的动态切换可以提高系统的灵活性和可配置性。系统可以根据不同的需求动态选择合适的中介者,从而实现不同的通信策略和行为。

4、中介者链和中介者的动态切换案例

下面是一个更复杂的示例,展示了中介者链和中介者的动态切换的实现:


import java.util.ArrayList;
import java.util.List;// 定义事件接口
interface Event {void execute();
}// 定义组件接口
interface Component {void setMediator(Mediator mediator);void receiveEvent(Event event);void sendEvent(Event event);
}// 定义中介者接口
interface Mediator {void registerComponent(Component component);void sendEvent(Component sender, Event event);
}// 实现具体的事件
class ConcreteEvent implements Event {private String message;public ConcreteEvent(String message) {this.message = message;}public void execute() {System.out.println("Executing event: " + message);}}// 实现具体的组件
class ConcreteComponent implements Component {private Mediator mediator;private String name;public ConcreteComponent(String name) {this.name = name;}public void setMediator(Mediator mediator) {this.mediator = mediator;}public void receiveEvent(Event event) {System.out.println(name + " received event: " + event);// 处理事件逻辑}public void sendEvent(Event event) {System.out.println(name + " sending event: " + event);mediator.sendEvent(this, event);}}// 实现具体的中介者
class ConcreteMediator implements Mediator {private List<Component> components;private Mediator nextMediator;public ConcreteMediator() {components = new ArrayList<>();}public void setNextMediator(Mediator mediator) {this.nextMediator = mediator;}public void registerComponent(Component component) {components.add(component);}public void sendEvent(Component sender, Event event) {for (Component component : components) {if (component != sender) {component.receiveEvent(event);}}if (nextMediator != null) {nextMediator.sendEvent(sender, event);}}}public class Main {public static void main(String[] args) {Mediator mediator1 = new ConcreteMediator();Mediator mediator2 = new ConcreteMediator();Mediator mediator3 = new ConcreteMediator();Component component1 = new ConcreteComponent("Component 1");Component component2 = new ConcreteComponent("Component 2");Component component3 = new ConcreteComponent("Component 3");mediator1.registerComponent(component1);mediator2.registerComponent(component2);mediator3.registerComponent(component3);mediator1.setNextMediator(mediator2);mediator2.setNextMediator(mediator3);component1.setMediator(mediator1);component2.setMediator(mediator2);component3.setMediator(mediator3);Event event = new ConcreteEvent("Hello, world!");component1.sendEvent(event);}}

在这个示例中,我们定义了一个更复杂的中介者模式应用。我们有三个中介者对象 mediator1mediator2mediator3,以及三个组件对象 component1component2component3,每个组件都有一个唯一的名称。


我们通过 registerComponent 方法将组件注册到相应的中介者中,并通过 setNextMediator 方法设置中介者的下一个中介者。这样,我们就创建了一个中介者链。


sendEvent 方法中,中介者将事件依次传递给其他组件,并且如果有下一个中介者存在,则将事件传递给下一个中介者。


Main 类中,我们创建了中介者和组件对象,并将它们注册到中介者中。然后,我们设置中介者之间的关系,形成中介者链。最后,我们发送一个事件给第一个组件,事件将在中介者链中传递给其他组件。


总结:

中介者模式作为一种重要的设计模式,在实际应用中有许多高级应用和进阶技巧可以探索。本文介绍了事件驱动的中介者、中介者链和中介者的动态切换这三个方面的内容。希望这些信息能够为你提供一些启发,进一步应用和扩展中介者模式。

好了,今天的分享到此结束。如果觉得我的博文帮到了您,您的点赞和关注是对我最大的支持。如遇到什么问题,可评论区留言。


这篇关于二十三种设计模式全面解析-解放组件间的通信束缚:深入探讨中介者模式的高级应用和进阶技巧的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445661

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu1394(线段树点更新的应用)

题意:求一个序列经过一定的操作得到的序列的最小逆序数 这题会用到逆序数的一个性质,在0到n-1这些数字组成的乱序排列,将第一个数字A移到最后一位,得到的逆序数为res-a+(n-a-1) 知道上面的知识点后,可以用暴力来解 代码如下: #include<iostream>#include<algorithm>#include<cstring>#include<stack>#in

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象