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

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

    • 一、中介者模式概述
      • 1.1 什么是中介者模式
      • 1.2 简单实现中介者模式
      • 1.3 使用中介者模式的注意事项
    • 二、中介者模式的用途
    • 三、中介者模式实现方式
      • 3.1 使用接口和类的方式
      • 3.2 使用抽象工厂模式的方式
      • 3.3 使用单例模式的方式

一、中介者模式概述

1.1 什么是中介者模式

中介者模式,又被称为调停者模式,是一种行为型设计模式,其核心思想是通过引入一个中介对象来封装一系列对象之间的交互。这种模式使得各对象不需要显式地相互引用,从而降低了它们之间的耦合度和依赖性,使得系统更易于维护和扩展。

中介者模式的主要角色包括:

抽象中介者(Mediator):定义中介者接口,声明各种业务方法。
具体中介者(Concrete Mediator):实现抽象中介者接口,负责与各个同事对象之间的通信和协调。
抽象同事类(Colleague):定义同事类接口,声明一些抽象方法,用于与中介者进行通信。
当系统中的对象之间的关系变得复杂,例如形成网状结构时,中介者模式尤为有用。通过引入中介者,可以将原本复杂的网状结构转化为更为清晰的星型结构,使得各个对象之间的交互更加明确和简单。

举个例子,考虑一个团队协作的场景,团队成员之间可能存在大量的沟通和协作。如果不使用中介者模式,那么每个成员都可能需要知道与其他所有成员的联系方式,这样当有新的成员加入或某个成员离开时,整个系统的复杂度都会增加。而使用中介者模式后,团队成员只需要与中介者通信,由中介者负责调度和协调各个成员之间的交互。

1.2 简单实现中介者模式

中介者模式是一种行为型设计模式,它通过引入一个中介者对象来协调多个对象之间的交互。以下是一个简单的Java实现:

首先,创建一个抽象的中介者类(Mediator):

public abstract class Mediator {protected List<Colleague> colleagues = new ArrayList<>();public void addColleague(Colleague colleague) {colleagues.add(colleague);}public void removeColleague(Colleague colleague) {colleagues.remove(colleague);}public abstract void sendMessage(String message, Colleague sender);
}

然后,创建一个具体的中介者类(ConcreteMediator):

public class ConcreteMediator extends Mediator {@Overridepublic void sendMessage(String message, Colleague sender) {for (Colleague colleague : colleagues) {if (colleague != sender) {colleague.receiveMessage(message, sender);}}}
}

接下来,创建抽象的同事类(Colleague):

public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;mediator.addColleague(this);}public abstract void sendMessage(String message);public abstract void receiveMessage(String message, Colleague sender);
}

最后,创建具体的同事类(ConcreteColleagueA和ConcreteColleagueB)

public class ConcreteColleagueA extends Colleague {public ConcreteColleagueA(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {System.out.println("同事A发送消息:" + message);mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message, Colleague sender) {System.out.println("同事A收到来自" + sender + "的消息:" + message);}
}public class ConcreteColleagueB extends Colleague {public ConcreteColleagueB(Mediator mediator) {super(mediator);}@Overridepublic void sendMessage(String message) {System.out.println("同事B发送消息:" + message);mediator.sendMessage(message, this);}@Overridepublic void receiveMessage(String message, Colleague sender) {System.out.println("同事B收到来自" + sender + "的消息:" + message);}
}

现在,你可以创建中介者和同事对象,并测试它们之间的交互:

public class Main {public static void main(String[] args) {Mediator mediator = new ConcreteMediator();Colleague colleagueA = new ConcreteColleagueA(mediator);Colleague colleagueB = new ConcreteColleagueB(mediator);colleagueA.sendMessage("你好,同事B!");colleagueB.sendMessage("你好,同事A!");}
}

运行上述代码,你将看到以下输出:

同事A发送消息:你好,同事B!
同事B收到来自同事A的消息:你好,同事B!
同事B发送消息:你好,同事A!
同事A收到来自同事B的消息:你好,同事A

1.3 使用中介者模式的注意事项

  • 1、中介者模式适用于多个对象之间存在复杂的交互关系,需要协调和统一管理的情况。

  • 2、中介者模式会增加系统的复杂性和维护成本,因此应该谨慎使用。

  • 3、中介者模式可能会导致性能问题,因为所有的消息都需要通过中介者传递。

  • 4、中介者模式应该尽量避免过多的中介者对象,否则会导致系统更加复杂。

  • 5、在设计中介者模式时,应该考虑到系统的可扩展性和灵活性,以便在未来可以方便地添加或删除对象。

  • 6、中介者模式应该避免过度依赖中介者对象,否则会导致系统变得脆弱和不可维护

二、中介者模式的用途

  • 1、简化对象之间的关系:中介者模式能够简化系统内各个对象之间的相互关系,将原本复杂的网状结构转变为相对简单的线性结构。

  • 2、降低系统的复杂性:通过引入中介者对象,可以减少子类生成,降低了系统的复杂性和维护成本。

  • 3、提高系统的灵活性和可扩展性:当需要增加新的功能或者删除某个对象时,只需要对中介者进行修改,而不需要修改其他对象,从而提高了系统的灵活性和可扩展性。

  • 4、封装转换规则:中介者模式能够将对象间的交互规则进行封装,使得对象间的交互更加清晰。

三、中介者模式实现方式

3.1 使用接口和类的方式

通过定义一个中介者接口,然后创建具体的中介者类来实现中介者模式。

// 中介者接口
interface Mediator {void send(String message, Colleague colleague);
}// 具体中介者类
class ConcreteMediator implements Mediator {private List<Colleague> colleagues = new ArrayList<>();public void addColleague(Colleague colleague) {colleagues.add(colleague);}public void send(String message, Colleague colleague) {for (Colleague c : colleagues) {if (c != colleague) {c.receive(message);}}}
}// 同事类
abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;mediator.addColleague(this);}public abstract void send(String message);public abstract void receive(String message);
}

3.2 使用抽象工厂模式的方式

通过定义一个抽象工厂类来创建具体的中介者对象,然后在具体的工厂类中实现中介者对象的创建。

// 抽象工厂类
abstract class AbstractFactory {public abstract Mediator createMediator();
}// 具体工厂类
class ConcreteFactory extends AbstractFactory {@Overridepublic Mediator createMediator() {return new ConcreteMediator();}
}

3.3 使用单例模式的方式

通过定义一个中介者类,并使用单例模式来确保整个系统中只有一个中介者对象。

// 中介者类
class Mediator {private static Mediator instance;private List<Colleague> colleagues = new ArrayList<>();private Mediator() {}public static Mediator getInstance() {if (instance == null) {instance = new Mediator();}return instance;}public void addColleague(Colleague colleague) {colleagues.add(colleague);}public void send(String message, Colleague colleague) {for (Colleague c : colleagues) {if (c != colleague) {c.receive(message);}}}
}

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

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

相关文章

链动2+1模式系统开发之区域代理深度解析

区域代理的保护机制&#xff1a;在链动商城系统里设定的代理有唯一性&#xff0c;每个省只有一个省代&#xff0c;每个市只有一个市代&#xff0c;每个区县只有一个区县代。这样也是保护每个代理的收益权益。 区域代理包含的权益类别&#xff1a;购物奖励折扣&#xff1b;区域实…

Python实现猎人猎物优化算法(HPO)优化XGBoost回归模型(XGBRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei& Keynia于2022年提出的一种最新的…

Marin说PCB之 PCB封装和原理图封装的藕断丝连

最近天气开始降温了&#xff0c;小编我不得不拿出珍藏多年的秋裤穿上了&#xff0c;就是走路不太方便&#xff0c;有点紧啊&#xff0c;可能是当时衣服尺码买小了吧&#xff0c;不可能是我吃胖了&#xff0c;这个绝对不可能。 话说小编我今年属实有点走霉运啊&#xff0c;下班和…

计网自顶向下(Web服务器+UDPping+邮件客户端)

目录 &#x1f416;前言 &#x1f33c;Web服务器(作业1) &#x1f333;过程 &#x1f333;解释 &#x1f525;代码 &#x1f33c;UDPping程序(作业2) &#x1f333;过程 &#x1f333;解释 Client Server 整体逻辑 &#x1f525;代码 &#x1f33c;邮件客户端(作业…

Sass 最基础的语法

把每个点最简单的部分记录一下&#xff0c;方便自己查找 官方文档链接 Sass 笔记 1. & 父选择器&#xff0c;编译后为父选择器2. : 嵌套属性3. $ 变量3.1 数据类型3.2 变量赋值3.3. 数组3.4. map 4. 算数运算符5. #{}插值语法5.1 可以在选择器或属性名中使用变量5.2 将有引…

SQL对数据进行去重

工作中使用SQL对数据进行处理计算时可能会遇到这样的问题&#xff1b;读取的表数据会有重复&#xff0c;或者我们关注的几个字段的数据会有重复&#xff0c;直接使用原表数据会引起计算结果不准或者做表连接时产生笛卡尔积。 本文记录使用SQL进行数据去重的几种算法。 distinc…

ChineseChess.2023.11.13.01

中国象棋残局模拟器ChineseChess.2023.11.13.01

正交矩阵的定义

对于n阶矩阵A&#xff0c;如果&#xff0c;其中为单位矩阵&#xff0c;为A的转置矩阵&#xff0c;那么就称A为正交矩阵。 对于正交矩阵&#xff0c; 对于正交矩阵&#xff0c;其列向量都是单位向量&#xff0c;行向量都是单位向量

【matlab】KMeans KMeans++实现手写数字聚类

目录 matlab代码kmeans matlab代码kmeans MNIST DATABASE下载网址: http://yann.lecun.com/exdb/mnist/ 聚类 将物理或抽象对象的集合分成由类似特征组成的多个类的过程称为聚类(clustering)。 对于给定N个n维向量x1&#xff0c;…&#xff0c;xN∈Rn&#xff0c;聚类的目标…

亚马逊云科技Zero ETL集成全面可用,可运行近乎实时的分析和机器学习

亚马逊云科技数据库、数据分析和机器学习全球副总裁Swami Sivasubramanian曾指出&#xff1a;“数据是应用、流程和商业决策的核心。”如今&#xff0c;客户常用的数据传输模式是建立从Amazon Aurora到Amazon Redshift的数据管道。这些解决方案能够帮助客户获得新的见解&#x…

通讯协议学习之路(实践部分):SPI开发实践

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 本文…

Spring的Redis客户端

如何在Spring中操作redis 在创建springboot项目的时候引入redis的依赖. 在配置文件里指定redis主机的地址和端口,此处我们配置了ssh隧道,所以连接的就是本机的8888端口. 创建一个controller类,注入操作redis的对象. 前面使用jedis,是通过jedis对象里的各种方法来操作redis的,此…

java写一个自动爬取统计局公开数据的程序

在Java中&#xff0c;爬取网站内容的最常用的库是Jsoup。以下是一个简单的爬虫程序示例&#xff0c;它将爬取统计局网站上的公开采集内容&#xff1a; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.El…

Ionic组件 ion-list ion-list-header

1 ion-list 列表由多行项目组成&#xff0c;这些项目可以包含 text, buttons, toggles, icons, thumbnails等。列表通常包含具有类似数据内容的项目&#xff0c;如 images and text。 列表支持多种交互&#xff0c;包括滑动项目以显示选项、拖动以重新排列列表中的项目以及删除…

MySQL表的增删改查(进阶)

目录 数据库约束 约束的定义 约束类型 null约束 unique:唯一约束 default:默认值约束 primary key:主键约束(重要) foreign key:外键约束(描述两个表之间的关联) 表的设计 一般思路 三大范式 一对一 一对多 ​编辑 多对多 ​编辑 新增 查询 聚合查询 聚合函…

Ridgeline plot / 远山图 / 山脊图 怎么画?怎么优化?

工具 Origin 2022 当然&#xff0c;用Matlab、Python也是可以的。 颜色配置 色卡调整

GEE:将鼠标变成十字指针,点击获取影像值,显示值到UI中

作者&#xff1a;CSDN _养乐多_ 本文记录了在 Google Earth Engine&#xff08;GEE&#xff09;开发中&#xff0c;将鼠标变成十字指针&#xff0c;点击获取影像值&#xff0c;显示值到UI中的代码片段。这段代码复制过去修改变量名就可以用了。 效果如下图所示&#xff0c; …

Transformer详解一:transformer的由来和先导知识

目录 参考资料前言一、预训练二、神经网络语言模型&#xff08;NNLM&#xff09;&#xff1a;预测下一个词one-hot编码的缺陷词向量&#xff08;word embedding&#xff09; 三、Word2Vec模型&#xff1a;得到词向量CBOWSkip-gramWord2Vec和NNLM的区别Word2Vec的缺陷 四、ELMO模…

Python---练习:把8名讲师随机分配到3个教室

案例&#xff1a;把8名讲师随机分配到3个教室 列表嵌套&#xff1a;有3个教室[[],[],[]]&#xff0c;8名讲师[A,B,C,D,E,F,G,H]&#xff0c;将8名讲师随机分配到3个教室中。 分析&#xff1a; 一步步来解决。 首先&#xff0c; 要求有3个教室&#xff0c;第一间教室、第二间…

微信小程序真机调试连接状态一直在正常和未链接之间反复横跳?

背景&#xff1a;小程序真机调试的时候&#xff0c;发现真机的network不显示接口调用情况&#xff0c;控制台也没有输出内容。具体如下所示&#xff1b; 解决方法&#xff1a; 1、确保手机端连接的网络和微信开发者工具网络一致&#xff0c;比如用同一个WiFi 2、真机自动调试…