当前位置: 首页 > news >正文

【设计模式】中介者模式的应用

文章目录

  • 1.概述
  • 2.中介者模式的适用场景
    • 2.1.用户界面事件
    • 2.2.分布式架构多模块通信
  • 3.总结

1.概述

中介者模式(Mediator Pattern)是一种行为型设计模式,它用于解决对象间复杂、过度耦合的问题。当多个对象(一般是两个以上的对象)之间存在复杂的相互关联和直接通信时,中介者模式通过引入一个新的中介对象来封装和集中处理这些对象间的交互逻辑,从而降低对象之间直接耦合。
说的再具体一点,就是原本相互依赖的对象(通常称为同事类或者参与者)不直接相互引用,而是通过中介者对象进行交互。每个对象都将请求委托给中介者,由中介者决定如何分发这些请求以及如何协调各个对象的行为。这样,各个对象只知道与中介者打交道,而不必了解彼此的存在和具体的交互方式,这有助于简化对象间的交互关系,使得系统更易于维护和扩展。

用网络拓扑图来做一个对比,假设现在有5台计算机都是互相独立交互的,拓扑成了网状结构:
在这里插入图片描述
现在中间加入一台交换机,所有的计算机都通过交换机这个中介者进行交互,拓扑图就由网状变成了星型,这样就减少了很多杂乱的依赖和耦合:
在这里插入图片描述


简而言之,中介者模式的主要作用就是:

  • 解耦对象间的直接联系。
  • 将对象间的交互逻辑集中到一个中介者对象中。
  • 提供一个统一的接口用于相关对象之间的通信。

2.中介者模式的适用场景

上面提到了,中介者模式适用于多种需要解耦对象之间复杂交互关系的业务场景,下面例举几个:

2.1.用户界面事件

在很多资料中都以用户界面的事件来介绍中介者模式,在WEB前端,例如VUE中也有相同的实现,例如在表单的开发中,单选框、文本框、下拉框等组件之间的交互频繁而复杂,第一行的单选框可能会影响第二行,第三行的显示,点击第二行又可能影响第四行,第五行的显示等等。
这时候,如果每个操作都单独写一个事件,会使得函数的数量膨胀,变得非常复杂,这时候就可以考虑使用中介者模式。感兴趣的同学可以去看看我之前的博客《Vue3开发基础:响应式变量、双向绑定、计算属性、监听器》 中的 4.3.对象监听(select联动),这里就不做赘述了。在这里插入图片描述

2.2.分布式架构多模块通信

在分布式架构中,一块大的业务会被分解到不同的微服务中,多个服务协作完成一个个的业务流程,这就涉及到不同的服务之间是需要建立通信关系的,如果放任不同的服务自行建立通信,很可能会导致服务间的关系变得杂乱,不利于后续的微服务治理工作。
所以,一般在分布式的架构中,会通过中介者服务,将模块间的直接调用关系转为模块与中介者的间接交互,简化通信逻辑,方便整体协调和控制。主要体现在以下一些方面:

  • 注册中心
    每一个服务都将自己的服务信息注册到注册中心,需要获取依赖服务的信息时,也从注册中心获取,这里的注册中心起到的是中介者的作用。
  • API网关
    外部客户端的所有请求首先经过一个中央入口点(即中介者),这个入口提供了一个统一的接口集合,就像中介者提供一个统一的接口让同事类(在这里是微服务)通过它进行交互。客户端只需面对一个接口,而内部复杂的微服务结构则得到了良好的隔离。
    还可能包含鉴权、限流、熔断、缓存、日志记录、监控、协议转换等各种横切关注点的处理。这些原本分散在各个微服务中的逻辑被集中到API Gateway中,减少了微服务间的直接耦合。
  • 事件驱动架构
    中介者可以作为事件总线或消息代理,如RabbitMQ、Kafka等,各个微服务通过发布和订阅消息的方式来通信,而不是直接调用其他服务的API。这种情况下,消息中间件的服务端(中介者)负责消息的传递、存储和路由。

这里提一下事件驱动中的消息队列,这部分看起来更应该归纳到观察者模式(或者叫发布订阅模式)中,不熟悉观察者模式的可以看看《循序渐进的理解观察者模式》,那么中介者模式观察者模式在这里有什么区别和联系呢?

  • 消息中间件中的发布-订阅模式: 发布者(生产者)将消息发布到某个主题或队列,而订阅者(消费者)则监听感兴趣的主题或队列,当有消息发布时,订阅者会接收到通知并处理消息。

  • 中介者模式: 当我们提到消息中间件作为中介者模式的应用时,重点在于其在整个系统架构层面的作用,即它作为一个中介角色,负责协调不同微服务间的交互,减少微服务间的直接耦合。通过消息中间件,微服务不再需要知道其他微服务的具体位置和实现细节,而是通过统一**消息中间件的服务端(中介)**进行通信。

在实际应用中,消息中间件既可以视为观察者模式的技术手段,也可以看作是中介者模式的一部分,因为它统一管理了服务间的通信逻辑,并通过异步的方式解耦了服务之间的直接联系,在微服务架构中,这两种模式并不是非此即彼,而是相辅相成,共同服务于系统的设计和优化

3.总结

中介者模式在实际的应用中,在解耦服务、简化通信逻辑、易于扩展和维护方面能够起到积极的作用,但也需要明确的是,中介者的引入会带来额外的复杂性,例如系统架构的复杂性,代码的复杂性等,同时中介者一旦出现故障,可能导致整个系统部分功能失效,因此需要对中介者实施高可用和容错策略。
所以,在实际使用的过程中,对象之间的依赖是不可避免的,只有在多个对象(两个以上的对象)之间存在复杂的相互关联和直接通信时,才酌情考虑使用中介者,而不是只要出现依赖就使用中介者来处理,这样只会有害而无益。

相关文章:

【设计模式】中介者模式的应用

文章目录 1.概述2.中介者模式的适用场景2.1.用户界面事件2.2.分布式架构多模块通信 3.总结 1.概述 中介者模式(Mediator Pattern)是一种行为型设计模式,它用于解决对象间复杂、过度耦合的问题。当多个对象(一般是两个以上的对象&…...

【微服务篇】分布式事务方案以及原理详解

分布式事务是指事务参与者、资源服务器、事务管理器分布在不同的分布式系统的多个节点之上的事务。在微服务架构、大型分布式系统和云计算等环境中,由于系统间调用和资源访问的复杂性,分布式事务变得尤为重要。 应用场景 跨系统交易:当交易…...

String 类的常用方法都有那些?

String 类在 Java 中是一个非常重要的类,用于处理文本数据。它提供了许多方法来操作字符串。以下是一些 String 类的常用方法: 构造方法 String(): 创建一个新的空字符串对象。String(byte[] bytes): 使用指定的字节数组来创建一个新的 String 对象。S…...

用XMLHttpRequest发送和接收JSON数据

百度的AI回答了一个案例: var xhr new XMLHttpRequest(); var url "your_endpoint_url"; // 替换为你的API端点 var data JSON.stringify({key1: "value1",key2: "value2" });xhr.open("POST", url, true); xhr.setReq…...

华为云使用指南02

5.​​使用GitLab进行团队及项目管理​​ GitLab旨在帮助团队进行项目开发协作,为软件开发和运营生命周期提供了一个完整的DevOps方案。GitLab功能包括:项目源码的管理、计划、创建、验证、集成、发布、配置、监视和保护应用程序等。该镜像基于CentOS操…...

halcon目标检测标注保存

* 创建一个新的字典 create_dict(ObjectDictionary) * 类别名称列表和对应的ID列表 class_names : [Defect1,Defect2,Defect3,Defect4,Defect5,Defect6,Defect7,Defect8,Defect9,Defect10,Defect11,Defect12,Defect13,Defect14,Defect15,Defect16,Defect17,Defect18] class_id…...

Python图像处理——计算机视觉中常用的图像预处理

概述 在计算机视觉项目中,使用样本时经常会遇到图像样本不统一的问题,比如图像质量,并非所有的图像都具有相同的质量水平。在开始训练模型或运行算法之前,通常需要对图像进行预处理,以确保获得最佳的结果。图像预处理…...

编译安装飞桨fastdeploy@FreeBSD(失败)

FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具, 支持云边端部署。提供超过 🔥160 Text,Vision, Speech和跨模态模型📦开箱即用的部署体验,并实现🔚端到端的推理性能优化。包括 物…...

java组合总和(力扣Leetcode39)

组合总和 力扣原题链接 问题描述 给定一个无重复元素的整数数组 candidates 和一个目标整数 target,找出 candidates 中可以使数字和为目标数 target 的所有不同组合,并以列表形式返回。你可以按任意顺序返回这些组合。 示例 示例 1: 输…...

ZK友好代数哈希函数安全倡议

1. 引言 前序博客: ZKP中的哈希函数如何选择ZK-friendly 哈希函数?snark/stark-friendly hash函数Anemoi Permutation和Jive Compression模式:高效的ZK友好的哈希函数Tip5:针对Recursive STARK的哈希函数 随着Incrementally Ve…...

VMware vSAN OSA存储策略 - 基于虚拟机的分布式对象存储

简介 博客:https://songxwn.com/ 存储策略 (Storage Policy) 是管理员定义的一组规则,这组规则定义了数据对象在 vSAN 存储上是如何保存的,存储策略定义了数据存储的可靠性、访问性能等特性。vSAN 提供了基于存储策略的存储管理 SPBM (Stor…...

JUC内容概述

复习概念 Sleep和Wait的区别 Sleep是Thread的静态方法,wait是Object的方法,任何对象实例都可以使用sleep不会释放锁,他也不需要占用锁,暂停。wait会释放锁,但是调用他的前提是线程占有锁他们都可以被Interrupted方法…...

postcss安装和使用

要安装和使用 PostCSS,你可以按照以下步骤操作: 步骤一:安装 PostCSS 在项目目录下,通过 npm 初始化一个新的 package.json 文件(如果还没有): npm init -y 安装 PostCSS 和必要的插件&#x…...

macOS 13 Ventura (苹果最新系统) v13.6.6正式版

macOS 13 Ventura是苹果电脑的全新操作系统,它为用户带来了众多引人注目的新功能和改进。该系统加强了FaceTime和视频通话的体验,同时优化了邮件、Safari浏览器和日历等内置应用程序,使其更加流畅、快速和安全。特别值得一提的是,…...

WordPress Git主题 响应式CMS主题模板

分享的是新版本,旧版本少了很多功能,尤其在新版支持自动更新后,该主题可以用来搭建个人博客,素材下载网站,图片站等 主题特点 兼容 IE9、谷歌 Chrome 、火狐 Firefox 等主流浏览器 扁平化的设计加响应式布局&#x…...

安卓国内ip代理app,畅游网络

随着移动互联网的普及和快速发展,安卓手机已经成为我们日常生活和工作中不可或缺的一部分。然而,由于地理位置、网络限制或其他因素,我们有时需要改变或隐藏自己的IP地址。这时,安卓国内IP代理App便成为了一个重要的工具。虎观代理…...

Day53:WEB攻防-XSS跨站SVGPDFFlashMXSSUXSS配合上传文件添加脚本

目录 MXSS UXSS:Universal Cross-Site Scripting HTML&SVG&PDF&SWF-XSS&上传&反编译(有几率碰到) SVG-XSS PDF-XSS Python生成XSS Flash-XSS 知识点: 1、XSS跨站-MXSS&UXSS 2、XSS跨站-SVG制作&配合上传 3、XSS跨站-…...

k8s安装traefik作为ingress

一、先来介绍下Ingress Ingress 这个东西是 1.2 后才出现的,通过 Ingress 用户可以实现使用 nginx 等开源的反向代理负载均衡器实现对外暴露服务,以下详细说一下 Ingress,毕竟 traefik 用的就是 Ingress 使用 Ingress 时一般会有三个组件: …...

如何在Windows 10中打开屏幕键盘?这里有详细步骤

本文解释了在Windows 10中打开或关闭屏幕键盘的不同方法,还解释了如何将屏幕键盘固定到开始菜单。 使用屏幕键盘的快捷键 如果你喜欢快捷方式,你会喜欢这个:按物理键盘上的WinCTRLO。这将立即显示屏幕键盘,而无需通过轻松使用。…...

【Pt】马灯贴图绘制过程 03-制作油渍、积尘效果

目录 效果 一、制作油渍效果 1.1 基本油渍 1.2 流淌的油渍痕迹 二、制作浮尘效果 三、制作积尘效果 效果 一、制作油渍效果 1.1 基本油渍 将上篇制作的“锈迹_深色”和“锈迹_浅色”两个文件夹再次合并为一个文件夹 这里就命名为“锈迹” 添加一个填充图层 设置Base …...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...