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

设计模式: 行为型之中介者模式(18)

中介者模式概述

  • 中介者模式(Mediator Pattern)是一种行为设计模式,它用于减少对象之间的直接交互,从而使其可以松散耦合
  • 中介者模式通过引入一个中介者对象来协调多个对象之间的交互,使得这些对象不需要知道彼此的具体实现,只需与中介者进行通信
  • 中介者模式结构
    • 中介者(Mediator)
      • 定义了一个接口,用于与各同事对象通信
    • 具体中介者(ConcreteMediator)
      • 实现中介者接口,协调各个同事对象之间的交互
      • 并可以维护同事对象之间的引用关系
    • 同事类(Colleague)
      • 每一个同事对象都知道中介者对象,并与它通信
      • 但不知道其他同事对象,同事对象之间的交互通过中介者对象来完成

中介者模式应用

// 1. 定义同事类(Colleague)接口
interface Colleague {mediator: Mediator;send(message: string): void;receive(message: string): void;
}// 2. 定义中介者(Mediator)接口
interface Mediator {register(colleague: Colleague): void;sendMessage(sender: string, message: string): void;
}// 3. 创建具体同事类
class ConcreteColleagueA implements Colleague {mediator: Mediator;name: string;constructor(name: string, mediator: Mediator) {this.mediator = mediator;this.name = name;}send(message: string): void {this.mediator.sendMessage(this.name, message);}receive(message: string): void {console.log(`${this.name} received the message: ${message}`);}
}class ConcreteColleagueB implements Colleague {mediator: Mediator;name: string;constructor(name: string, mediator: Mediator) {this.mediator = mediator;this.name = name;}send(message: string): void {this.mediator.sendMessage(this.name, message);}receive(message: string): void {console.log(`${this.name} received the message: ${message}`);}
}// 4. 创建具体中介者类
class ConcreteMediator implements Mediator {private colleagues: Colleague[] = [];register(colleague: Colleague): void {this.colleagues.push(colleague);}sendMessage(sender: string, message: string): void {this.colleagues.forEach(colleague => {if (colleague.name !== sender) {colleague.receive(message);}});}
}// 使用示例
function main() {const mediator = new ConcreteMediator();const colleagueA = new ConcreteColleagueA("Colleague A", mediator);const colleagueB = new ConcreteColleagueB("Colleague B", mediator);mediator.register(colleagueA);mediator.register(colleagueB);colleagueA.send("Hello from A");colleagueB.send("Hello from B");
}main();
  • 首先,我们定义了两个接口:ColleagueMediator
    • Colleague 接口表示参与交互的对象,它有两个方法:send 用于发送消息,receive 用于接收消息
    • 并且有一个属性 mediator,指向中介者对象。Mediator 接口则定义了中介者应当具备的能力,包括注册同事对象(register)和转发消息(sendMessage
  • 我们创建了两个实现了 Colleague 接口的具体同事类 ConcreteColleagueAConcreteColleagueB
    • 每个具体同事类都有自己的名字,并且持有中介者对象
    • 当它们想要发送消息时,通过调用中介者的 sendMessage 方法而非直接和其他同事类通信
  • 实现了 Mediator 接口的 ConcreteMediator 类是具体的中介者
    • 它维护了一个同事对象列表,并提供 register 方法用于同事对象的注册
    • 当一个同事对象通过 sendMessage 发送消息时,中介者会遍历同事列表,将消息转发给除了发送者之外的所有同事对象
  • main 函数中,我们创建了一个 ConcreteMediator 对象作为中介者,并创建了两个同事对象(ConcreteColleagueAConcreteColleagueB
    • 接着,我们把这两个同事对象注册到中介者,并让每个同事对象发送一条消息
    • 此时,消息通过中介者转发,确保每个同事都能收到除自己发送之外的消息
  • 通过这个示例,我们可以看到中介者模式是如何解耦同事对象之间直接的通信关系,转而通过中介者来进行消息传递,从而降低了耦合度,增强了系统的可维护性和扩展性

中介者模式应用场景

  • 对象间的交互复杂:当系统中有多个对象相互协作,且它们之间的交互关系错综复杂,表现为网状结构或多对多关系时,可以使用中介者模式来集中管理这些交互,将原来分散在各个对象之间的交互逻辑转移到中介者中,从而简化对象间的直接依赖关系

  • 需要解耦对象:当发现系统中对象彼此之间的依赖性过高,修改一个对象可能引起一系列连锁反应时,通过中介者模式可以使对象之间的耦合度降低,提高系统的可维护性和扩展性

  • 通信逻辑需要集中控制:在一些场景中,如网络聊天室、飞行控制系统、游戏引擎中的实体交互、UI组件间通信等,需要有一个中心对象来管理和协调不同对象间的通信,这些场景非常适合采用中介者模式

  • 易于扩展新功能:当系统中未来可能增加更多参与者(对象)或者改变交互规则时,通过中介者模式可以相对容易地调整和扩展通信逻辑,因为大部分交互都在中介者内完成,不涉及其他对象的改动

  • 需要支持模块化:在大型软件系统中,中介者模式可以帮助将系统划分为可独立开发和测试的模块,每个模块作为一个对象与中介者交互,而模块间的复杂交互则通过中介者来组织和协调

  • 总之,中介者模式尤其适用于那些对象间交互繁杂,且希望避免对象之间紧密耦合的场景,通过引入中介者,可以将复杂的交互关系转化为中介者与各个对象之间的简单交互

中介者模式优缺点


1 ) 优点

  • 降低对象之间的耦合度:同事对象之间不再直接相互调用,而是通过中介者来间接通信,减少了它们之间的耦合

  • 易于维护:由于将对象之间的交互逻辑集中到了中介者对象中,因此如果需要修改交互方式,只需修改中介者即可,而无需修改所有同事对象

  • 简化对象之间的通信:同事对象不再需要知道其他对象的存在,只需与中介者通信,降低了通信的复杂性

  • 支持灵活的通信方式:中介者可以根据需要实现不同的通信策略,比如广播、单播等

2 )缺点

  • 可能产生过多的中介者:如果系统中存在过多的中介者,可能会导致系统结构变得复杂

  • 中介者可能变得过于复杂:如果中介者需要处理大量的同事对象之间的交互,其内部逻辑可能会变得相当复杂,难以维护

  • 可能引入新的依赖:同事对象依赖于中介者,如果中介者出现问题,可能会影响到多个同事对象的正常工作

  • 在使用中介者模式时,需要根据具体场景和需求权衡其优缺点,确保在降低耦合度和简化通信的同时,避免引入过多的复杂性和依赖关系

中介者模式和代理模式区别和联系

  • 中介者模式(Mediator Pattern)和代理模式(Proxy Pattern)都是设计模式中的行为型模式,它们在解决软件设计问题上有不同的侧重点和应用场景

1 )中介者模式

  • 目的: 解决对象之间的多重关联和通信复杂性问题,通过引入中介者对象来封装对象间的交互逻辑,使得原本相互耦合的对象转变为与中介者对象的单向关联,从而降低对象之间的耦合度。

  • 角色: 同事类(Colleague)、中介者(Mediator)

  • 作用: 中介者对象集中处理同事类之间的交互,同事类只与中介者交互,不直接与其他同事类交互。

  • 适用场景: 多个对象之间存在复杂的网状交互,如聊天室的消息路由、组件间的通信协调等

2 )代理模式

  • 目的: 为其他对象提供一个代理,以控制对这个对象的访问,增强或扩展功能,如延迟加载、安全性控制、访问权限控制、远程代理、虚拟代理等。
  • 角色: 主题(Subject)、代理(Proxy)、真实主题(Real Subject)
  • 作用: 代理对象替代真实对象,对外提供相同的接口,但可以在调用前后附加额外的操作,比如缓存、预处理、后处理、权限检查等。
  • 适用场景: 需要控制访问、增强功能、保护目标对象或透明地添加额外操作等场合,如数据库连接池、图片懒加载、远程服务调用等。

3 )区别与联系

  • 区别
    • 目的不同:中介者模式主要用于解耦对象间的复杂交互,而代理模式主要用于控制对对象的访问
    • 结构不同:中介者模式中对象与中介者单向交互,代理模式中代理与真实对象的接口一致,代理对象代替或辅助真实对象工作
    • 作用不同:中介者模式改变了对象间的通信结构,代理模式通常不会改变对象间的结构,只是在访问过程中增加了额外的逻辑
  • 联系
    • 都属于行为型设计模式,都通过引入中间层对象来改善原有对象结构和行为
    • 都是对对象功能的一种包装和扩展,只不过中介者模式更关注于整体的交互协调,而代理模式更侧重于个体对象的访问控制和功能扩展
    • 在实际开发中,这两种模式经常结合使用,共同优化系统的架构和设计
http://www.lryc.cn/news/337549.html

相关文章:

  • 计算机网络的起源与发展历程
  • 2024-4-12-实战:商城首页(下)
  • 一、flask入门和视图
  • Selenium+Chrome Driver 爬取搜狐页面信息
  • SpringBoot:一个注解就能帮你下载任意对象
  • oracle全量、增量备份
  • React Router 5 vs 6:使用上的主要差异与升级指南
  • 基于LNMP部署wordpress
  • openGauss_5.1.0 企业版快速安装及数据库连接:单节点容器化安装
  • 微信小程序 uniapp+vue城市公交线路查询系统dtjl3
  • 2024年MathorCup数模竞赛B题问题一二三+部分代码分享
  • Ubuntu日常配置
  • GMSSL-通信
  • linux 磁盘分区Inode使用率达到100%,导致网站无法创建文件报错 failed:No space leftondevice(
  • 探索Python库的奇妙世界
  • SQL Server 存储函数(funGetId):唯一ID
  • 当你的项目体积比较大?你如何做性能优化
  • 第6章:6.3.2 一张表总结正则表达式的语法 (MATLAB入门课程)
  • VBA 实现outlook 当邮件设置category: red 即触发自动创建jira issue
  • 办公软件巨头CCED、WPS迎来新挑战,新款办公软件已形成普及之势
  • 架构设计-订单系统之订单系统的架构进化
  • 性能升级,INDEMIND机器人AI Kit助力产业再蜕变
  • 2024年妈妈杯数学建模C题思路分析-物流网络分拣中心货量预测及人员排班
  • prometheus\skywalking\splunk功能的区别
  • Harmony鸿蒙南向驱动开发-SPI接口使用
  • 芒果YOLOv7改进96:检测头篇DynamicHead动态检测头:即插即用|DynamicHead检测头,尺度感知、空间感知、任务感知
  • 独一无二:探索单例模式在现代编程中的奥秘与实践
  • centos7 安装 rabbitmq3.8.5
  • 利用SOCKS5代理和代理IP提升网络安全与匿名性
  • C++list模拟实现