设计模式——中介者模式(Mediator)

中介者模式(Mediator Pattern)是一种行为型设计模式,其主要作用是通过一个中介对象来封装一系列对象的交互,从而降低它们之间的耦合度,提高系统的可维护性和可扩展性。

中介者模式的主要特点

  • 封装交互:用一个中介对象来封装一系列对象的交互,这些对象不再直接相互引用,而是通过中介者进行交互。
  • 降低耦合:由于对象之间的交互被封装在中介者对象中,因此它们之间的耦合度降低,对象可以更加独立地变化和复用。
  • 集中控制:多个对象之间的交互被封装在中介者对象中集中管理,当交互行为发生变化时,只需要修改中介者对象即可,而不需要修改各个对象。
  • 一对多关联:通过引入中介者对象,将原本多个对象之间复杂的多对多关联关系转变为对象与中介者之间的一对多关联关系,简化了系统的结构。

中介者模式的角色

  • 中介者(Mediator):定义了一个接口,用于与各同事对象进行通信。
  • 同事对象(Colleague):实现了一个接口,该接口用于与中介者进行通信。同事对象之间不再直接相互引用,而是通过中介者进行交互。

中介者模式的优缺点

优点

  • 降低了对象之间的耦合度,使得对象更加独立,易于复用和维护。
  • 将对象间复杂的多对多关联关系转变为简单的一对多关联关系,提高了系统的灵活性和可扩展性。
  • 集中控制交互行为,使得修改和维护更加容易。

缺点

  • 当同事对象数量较多时,中介者对象可能会变得臃肿和复杂,难以维护。
  • 如果中介者对象出现故障,可能会导致整个系统崩溃。

适用场景

  • 当系统中对象之间存在复杂的引用关系,导致系统结构混乱且难以理解时。
  • 当需要创建一个运行于多个类之间的对象,但又不想生成新的子类时。
  • 当需要改变系统的交互方式,但又不希望修改现有的对象时。

示例

我们可以考虑一个简单的聊天室示例,其中用户(同事对象)通过聊天室(中介者)进行通信。以下是这个示例的Java代码:

// 同事接口
interface Colleague {void sendMessage(String message);void receiveMessage(String message);void setMediator(Mediator mediator);
}// 用户类,实现同事接口
class User implements Colleague {private Mediator mediator;private String name;public User(String name) {this.name = name;}@Overridepublic void sendMessage(String message) {mediator.sendMessage(this, message);}@Overridepublic void receiveMessage(String message) {System.out.println(name + " received: " + message);}@Overridepublic void setMediator(Mediator mediator) {this.mediator = mediator;}
}// 中介者接口
interface Mediator {void register(Colleague colleague);void sendMessage(Colleague sender, String message);
}// 聊天室类,实现中介者接口
class ChatRoom implements Mediator {private List<Colleague> colleagues = new ArrayList<>();@Overridepublic void register(Colleague colleague) {colleagues.add(colleague);colleague.setMediator(this);}@Overridepublic void sendMessage(Colleague sender, String message) {for (Colleague colleague : colleagues) {if (!colleague.equals(sender)) {colleague.receiveMessage(sender.name + ": " + message);}}}
}// 客户端代码
public class Client {public static void main(String[] args) {ChatRoom chatRoom = new ChatRoom();User user1 = new User("Alice");User user2 = new User("Bob");chatRoom.register(user1);chatRoom.register(user2);user1.sendMessage("Hello, Bob! How are you?");}
}

在这个示例中,我们定义了一个Colleague接口,它包含了发送和接收消息的方法以及设置中介者的方法。User类实现了这个接口,并包含了用户的名字。Mediator接口定义了注册同事和发送消息的方法。ChatRoom类实现了这个接口,并管理了一个同事对象的列表。在ChatRoomsendMessage方法中,它遍历了所有的同事对象,并将消息发送给除了发送者之外的所有其他同事。

Client类中,我们创建了一个ChatRoom对象和两个User对象,并将它们注册到聊天室中。然后,我们让Alice向Bob发送一条消息。当这条消息被发送时,聊天室会将它转发给所有其他的用户(在这个例子中只有Bob),并打印出接收到的消息。

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

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

相关文章

windows gradle配置

安装 gradle下载地址&#xff1a; 官网&#xff1a;https://gradle.org/releases/ 所有版本&#xff1a;https://services.gradle.org/distributions/ 将下载后的zip文件解压 配置环境变量 在系统变量中新增以下变量 1、gradle的目录&#xff1a; GRADLE_HOME&#xff1a;D…

创新指南|将会话式AI聊天机器人纳入PLG增长战略

想象一个繁荣的数字城市广场&#xff0c;志同道合的人们在这里分享他们的激情、经验和知识。想象一个将房东与旅行者、顾客与司机、人们与他们喜爱的品牌无缝连接起来的平台。在这个世界里&#xff0c;用户交流促进增长&#xff0c;社区成为推动力。 如果您的应用程序天生不符…

P8802 [蓝桥杯 2022 国 B] 出差

P8802 [蓝桥杯 2022 国 B] 出差 分析 很明显&#xff1a;单源最短路径 没有负权边 dijkstra 1.存图 2.准备两个数组 dis[]&#xff1a;更新源点到各个点的距离 vis[]&#xff1a;标记是否访问 3.从源点开始&#xff0c;更新源点到与其邻接的点的距离&#xff0c;每次选…

鸿蒙OpenHarmony开发板解析:【特性配置规则】

特性 特性配置规则 下面介绍feature的声明、定义以及使用方法。 feature的声明 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 在部件的bundle.json文件中通过feature_list来声明部件的feature列…

spring的核心详解

Spring 核心详解 文章目录 Spring 核心详解前言什么是springspring的优点spring用到了哪些设计模式 什么是AOPAOP的实现方式静态代理动态代理 什么是IOCIOC的好处什么是依赖注入 前言 什么是spring Spring是一个开源的Java/Java EE全功能栈&#xff08;full-stack&#xff09…

MQTT 5.0 报文解析 03:SUBSCRIBE 与 UNSUBSCRIBE

欢迎阅读 MQTT 5.0 报文系列 的第三篇文章。在上一篇中&#xff0c;我们介绍了 MQTT 5.0 的 PUBLISH 及其响应报文。现在&#xff0c;我们将介绍用于订阅和取消订阅的控制报文。 在 MQTT 中&#xff0c;SUBSCRIBE 报文用于发起订阅请求&#xff0c;SUBACK 报文用于返回订阅结果…

蓝桥杯备战4.双子数

P9420 [蓝桥杯 2023 国 B] 子 2023 / 双子数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 筛素数 void get_prime(int n) {for(int i1;i<n;i){if(!st[i])prime[cnt]i;for(int j0;prime[j]<n/i;j){st[prime[j]*i]true;if(i%prime[j]0)break;}} } 解题 #include<…

Java通过百度地图API获取定位-普通IP定位

项目中有一个登录邮箱提醒的功能&#xff0c;需要根据IP地址获取定位信息&#xff0c;从而更好地提示用户账号登录的所在地。为此&#xff0c;花费了一些时间来实现这个功能。 在CSDN搜索了一下&#xff0c;发现关于获取定位的文章说明都不够详细&#xff0c;于是决定自己创作一…

Markdown和Latex中文字上下标的方法

技术背景 在Markdown和Latex中&#xff0c;如果只是写公式&#xff0c;不论是行内公式还是行间公式&#xff0c;都可以直接使用^和_这两个符号实现上下标。但有个问题是&#xff0c;如果只是使用公式来做上下标&#xff0c;出来的字体是斜着的。例如这样的语法&#xff1a; $$ …

为什么要学Python?学Python有什么用?

为什么要学Python&#xff1f;学Python有什么用&#xff1f; 在当今的数字化时代&#xff0c;编程已成为一项宝贵的技能。Python&#xff0c;作为一种流行的编程语言&#xff0c;因其易于学习和强大的功能而受到全球开发者的青睐。本文将探讨学习Python的原因和它的实际应用&am…

【操作系统期末速成】​操作系统概述(定义|功能|特征)|发展阶段和分类|结构设计|概念补充

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;操作系统&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到…

Nginx部署前后端分离项目

部署前后端分离项目&#xff0c;要求前端项目、后端项目、数据库分别部署在3台服务器 服务器准备 服务器名IP软件包前端192.168.99.137nginx后端192.168.99.139jar数据库192.168.99.100mariadb 1、前端服务器 yum install -y epel-release && yum install -y nginx…

202012青少年软件编程(Python)等级考试试卷(二级)

第 1 题 【单选题】 执行以下代码中,输出的结果是?( ) sum=0for i in range(1,10,3):sum=sum+iprint(sum,i)A :22 10 B :12 7 C :45 9 D :55 10 正确答案:B 试题解析: 第 2 题 【单选题】 下列代码的执行结果是?( ) s1="abcde"s2="fgh"s3=…

golang编程规范

文章目录 1&#xff1a;使用适当的缩进2&#xff1a;规范地导入包3&#xff1a;使用描述性变量和函数名称4&#xff1a;限制行长5&#xff1a;使用常量来代替魔术值6&#xff1a;错误处理7&#xff1a;避免使用全局变量8&#xff1a;使用结构体处理复杂数据9&#xff1a;给代码…

官宣:vAsterNOS正式发布!开放网络操作系统免费试用!

近期&#xff0c;vAsterNOS&#xff08;设备模拟器&#xff09;正式发布&#xff0c;可以满足用户快速了解 AsterNOS、体验实际操作、搭建模拟网络的需求&#xff0c;可运行在GNS3、EVE-NG等网络虚拟软件中。 AsterNOS 网络操作系统是星融元为人工智能、机器学习、高性能计算、…

算法 第56天 动态规划16

583 两个字符串的删除操作 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 def minDistance(word1,word2):dp[[0]*(len(word2)1) for _ in range(len(word1)1)]for i in range(len(word…

前端面试:项目细节问题(已工作|给大家做个分享)

1、介绍介绍整个项目的开发流程&#xff1f; 答&#xff1a;我面试时的回答&#xff1a;首先&#xff0c;产品、项目经理和甲方一起开会确认需求&#xff0c;产品编写需求文档&#xff0c;并画出原型图贴在需求文档上&#xff1b;然后&#xff0c;产品、项目经理、甲方、技术、…

vCenter 7.3证书过期无法登录处理方法

登录报错&#xff1a;如下图 Exception in invking authentication handler [SSL: CERTIFICATE_VERIFY_FAILED] certificate vertify failed: certificate has expired(_ssl.c:1076) 处理方法1&#xff1a;推荐&#xff0c;可行 登录vCenter控制台&#xff0c;AltF3切换至命令…

antdVue 自定义table列配置

最近做项目的时候需要对页面的table进行列配置的需求 子组件 <div><a-modaltitle"列配置" :visible"visible" :closable"false" :footer"null"width"800px" height"448px"><div><a-row>…

.DevicData-P-XXXXXXX勒索病毒数据怎么处理|数据解密恢复

导言&#xff1a; 在网络空间&#xff0c;每一次病毒或勒索软件的涌现都如同一次科技界的“地震”。而.DevicData-P-XXXXXXX勒索病毒&#xff0c;正是这场“地震”中的一股不可忽视的力量。它以其独特的加密技术和狡猾的传播方式&#xff0c;给全球的个人和企业带来了前所未有…