设计模式- 中介者模式(Mediator Pattern)结构|原理|优缺点|场景|示例

devtools/2024/9/20 3:52:08/ 标签: 设计模式, 中介者模式

                                     设计模式(分类)        设计模式(六大原则)   

    创建型(5种)        工厂方法         抽象工厂模式        单例模式        建造者模式        原型模式

    结构型(7种)        适配器模式        装饰器模式        代理模式        ​​​​​​外观模式      桥接模式        组合模式       享元模式

    行为型(11种)      策略模式        模板方法模式        观察者模式        迭代器模式     责任链模式     命令模式    备忘录模式          状态模式         访问者模式        中介者模式 


中介者模式(Mediator Pattern)是一种行为设计模式,它通过引入一个中介者对象来封装多个对象之间复杂的交互关系,使对象之间不必相互引用,从而减少对象间的耦合。中介者使各个对象不需要显式地相互引用,而是通过中介者进行间接通信,从而降低系统的复杂性和提高可维护性。

结构: 中介者模式的主要组成部分包括:

  1. Mediator(中介者):定义一个接口,用于同事对象之间的通信。具体中介者通过实现该接口,来协调各同事对象的行为。
  2. Colleague(同事类):每个同事类都了解中介者,并且通过中介者与其他同事通信,而不是直接与其他同事通信。每个同事类都维持一个对中介者的引用。
  3. ConcreteMediator(具体中介者):具体中介者实现中介者接口,它通常会持有多个同事对象的引用,用于协调和管理同事之间的交互。

原理:

  • 同事对象不再直接相互引用,而是将交互请求发送给中介者。
  • 中介者接收到请求后,根据请求内容和当前状态,决定如何响应或转发请求给适当的同事对象。
  • 通过中介者,可以集中管理对象间的交互,降低了对象间的耦合度,使得系统易于扩展和维护。

优缺点:

 优点:

  • 减少了类间直接耦合,使得对象易于复用和维护。
  • 中央控制,使得复杂系统中的对象交互更加清晰和灵活。
  • 方便添加新的交互方式或同事类,符合开闭原则。

缺点:

  • 中介者集中了控制权,一旦中介者出现问题,可能会影响整个系统。
  • 随着同事类的增多,中介者可能会变得复杂和难以管理。

应用场景:

  • 当一个系统中对象之间的交互非常多且复杂,导致难以理解各个对象的职责时。
  • 需要控制和协调多个对象间交互,避免对象间的紧耦合时。
  • 在图形用户界面(GUI)开发中,协调多个组件之间的交互。

代码示例(以Java为例) 

// 抽象中介者
interface ChatRoom {void sendMessage(String message, User user);
}// 具体中介者:聊天室
class ConcreteChatRoom implements ChatRoom {@Overridepublic void sendMessage(String message, User user) {for (User u : users) {if (!u.equals(user)) {u.receive(message);}}}// 管理用户列表private List<User> users = new ArrayList<>();public void addUser(User user) {users.add(user);}
}// 抽象同事类
abstract class User {protected String name;protected ChatRoom chatRoom;public User(String name, ChatRoom chatRoom) {this.name = name;this.chatRoom = chatRoom;}abstract void receive(String message);
}// 具体同事类:用户
class ConcreteUser extends User {public ConcreteUser(String name, ChatRoom chatRoom) {super(name, chatRoom);}@Overridevoid receive(String message) {System.out.println(name + " received: " + message);}public void sendMessage(String message) {chatRoom.sendMessage(message, this);}
}// 示例使用
public class MediatorPatternDemo {public static void main(String[] args) {ChatRoom chatRoom = new ConcreteChatRoom();User alice = new ConcreteUser("Alice", chatRoom);User bob = new ConcreteUser("Bob", chatRoom);chatRoom.addUser(alice);chatRoom.addUser(bob);alice.sendMessage("Hello, Bob!");bob.sendMessage("Hi, Alice!");}
}

 在这个例子中,ChatRoom作为中介者,管理着用户(User)之间的消息发送。用户之间并不直接通信,而是通过调用聊天室的sendMessage方法来间接通信。这样,即使增加新的用户或改变消息传播逻辑,也只需修改ChatRoom类,而无需修改用户类,符合中介者模式的设计思想。


http://www.ppmy.cn/devtools/24508.html

相关文章

golang垃圾回收

4.29 Golang中GC回收机制三色标记与混合写屏障 第14讲-总结哔哩哔哩bilibili 三个阶段 gc垃圾回收 早期是 GO1.3 标记清除  之前的标记清除&#xff1a;开始标记找到可达对象&#xff0c;并标记&#xff0c;标记完后清楚未标记的 较长时间的STW&#xff0c;使程序暂停…

ubuntu-meta-22.04桌面版+ros2-humble 镜像

ubuntu-meta-22.04桌面版ros2-humble 镜像 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1PSBe4EqWch44OQUlkCCEig?pwdknty 提取码&#xff1a;knty 镜像文件较大&#xff0c;分成了两个压缩包&#xff0c;下载后直接解压ubuntu22.04-desk-meta-ros2-arm (…

微信小程序 图片上传到文件服务器

业务需求&#xff1a; 图片先上传到后台文件服务器&#xff0c;服务器返回图片的id及相关信息&#xff0c;再和其他要提交的内容一块提交到后台接口。 话不多说&#xff0c;上代码 index.wxml <van-uploader max-count"5" multiple file-list"{{ photoD…

记录些RAG-Fusion、Agent、NL2SQL的问题

RAG-Fusion RAG-Fusion 的实现原理 Query Duplication with a Twist&#xff1a;用 LLM 根据用户的 Query 生成几个相关的但不同的 Queries。Vector Search Unleashed&#xff1a;对原 Query 和生成的 Queries 都进行向量&#xff08;或者其他方式的&#xff09;搜索。Intell…

Oracle 表分区

1.概述 分区表就是将表在物理存储层面分成多个小的片段&#xff0c;这些片段即称为分区&#xff0c;每个分区保存表的一部分数据&#xff0c;表的分区对上层应用是完全透明的&#xff0c;从应用的角度来看&#xff0c;表在逻辑上依然是一个整体。 目的&#xff1a;提高大表的查…

前端实现base64编码图片的导出、图片添加描述文字导出

1. base64编码图片的导出 调用handleDownload方法&#xff0c;传入图片的base64编码&#xff0c;将图片进行导出保存&#xff1a; // base64 转换blob对象 const base64ToBlob (base64: string) > {// 将Base64编码的字符串按;base64,拆分&#xff0c;得到内容类型和二进…

知识图谱:技术维度与应用实践

知识图谱是一种交叉技术领域&#xff0c;它结合了自然语言处理&#xff08;NLP&#xff09;、机器学习、计算机视觉&#xff08;CV&#xff09;等多种技术&#xff0c;用于构建和应用丰富的数据结构。本文将详细介绍知识图谱的技术维度、核心算法、以及在不同领域的应用实践。 …

摇杆控制电机

参考&#xff1a; 摇杆电位器控制步进电机正反转调速-Arduino中文社区 - Powered by Discuz! 一个基于树莓派和Python的无人机视觉跟踪系统_ 北漠苍狼的专栏(QQ:1746430162)-CSDN博客

junit组件的使用

JUnit 是一个广泛使用的 Java 单元测试框架&#xff0c;它帮助开发者编写可重复运行的测试用例来验证代码的正确性。下面是使用 JUnit 进行单元测试的基本步骤和一些关键概念&#xff1a; 安装与配置 依赖管理&#xff1a;如果你使用的是 Maven 或 Gradle 等构建工具&#xff…

JavaEE 初阶篇-深入了解特殊文件(Properties 属性文件、XML)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Properties 属性文件概述 1.1 Properties 属性文件特性与作用 1.2 使用 Properties 把键值对数据写出到属性文件中 1.3 使用 Properties 读取属性文件里的键值对数…

稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)

背景 OpenIM包含多个关键组件&#xff0c;每个都是系统功能必不可少的一部分。具体来说&#xff0c;MongoDB 用于持久化存储&#xff1b;Redis 用作缓存&#xff1b;Kafka 用于消息队列&#xff1b;Zookeeper 用于服务发现&#xff1b;Minio 用于对象存储。这些组件的众多可能会…

ChatGPT使用指南:Prompt简单提示词

在使用ChatGPT或其他基于AI的聊天模型时&#xff0c;有效地构建prompt&#xff08;提示词或指令&#xff09;是非常重要的。好的prompt可以帮助模型更准确地理解您的需求&#xff0c;并提供更贴切的回答。以下是一些构建高效prompt的技巧和示例。 1. 明确具体 当您向ChatGPT提…

C# wpf 运行时替换方法实现mvvm自动触发刷新

文章目录 前言一、如何实现&#xff1f;1、反射获取属性2、定义替换方法3、交换属性的setter方法 二、完整代码1、接口2、项目 三、使用示例1、倒计时&#xff08;1&#xff09;、继承ViewModelBase&#xff08;2&#xff09;、定义属性&#xff08;3&#xff09;、属性赋值&am…

TCP协议在物联网中实战

一、TCP协议介绍 网上对TCP协议介绍众多&#xff0c;本人按照自己的理解简单介绍一下。 TCP&#xff08;Transmission Control Protocol&#xff0c; 传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输控制层通信协议。 1.1 协议机制 1.1.1 三次握手 &…

$nextTick源码解析

this.$nextTick 是 Vue.js 内部使用的一个方法,用于在下一个 DOM 更新循环结束之后执行回调函数。 原理: nextTick 方法被调用后,会将回调函数存储在一个队列中Vue.js 会利用浏览器的异步队列机制,在 DOM 更新循环结束后执行这个队列中的所有回调函数。源码: /*** Defer…

LT1964ES5-5 低压差稳压器 200mA 贴片SOT-23-5 使用案例

LT1964ES5-5 微功耗 线性稳压器 LT1964ES5-5 是一款微功耗、低噪声、低dropout的负电压线性稳压器。它的功能是将输入电压转换为稳定的负输出电压&#xff0c;范围在-1.22V到-20V之间&#xff0c;最大输出电流为200mA。该器件特别适用于需要精密调节和低噪声电源的电路中&#…

对象存储服务的事件通知特性

AWS S3提供了事件通知的能力&#xff0c;即在客户应用访问对象存储时&#xff0c;对象存储服务可提供通知服务&#xff0c;支撑客户的特定应用场景&#xff0c;比如业务审计、计费等。 相关能力可参考官方文档。 相关API&#xff0c;如下&#xff1a; PutBucketNotificationGe…

Python AI库pandas读写数据库的应用操作——以sqlite3为例

Python AI库pandas读写数据库的应用操作——以sqlite3为例 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 已阅读Pandas基础操作文章,了解pandas常见操作 具备自主扩展学习能力 在数据分析和人工智能领域&#xff0c;pandas库和s…

【JS】找出两个数组中的相同元素与不同元素

一、找出相同元素 &#xff08;1&#xff09;方法一 const filterArr (arr1, arr2) > {let result [];for (let i 0; i < arr1.length; i) {for (let j 0; j < arr2.length; j) {if (arr1[i] arr2[j]) {result.push(arr1[i]);}}}return result; };&#xff08;…

基于迁移学习的语义句子分类器(微调一个预训练模型的案例,即迁移学习)

一、任务&#xff1a;基于迁移学习的语义句子分类器 项目介绍&#xff1a;本任务的目的是利用预训练好的模型来微调自己的微软研究释义语料库数据集&#xff0c;实现文本分类的任务&#xff0c;具体是判断两个句子的意思是否相同。在微调阶段&#xff0c;我们将整个模型的参数…