设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

1.概述

在面向对象的软件设计与开发过程中,根据“ 单一职责原则 ”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。

对于一个模块或者系统,可能由很多对象构成, 而且这些对象之间可能存在相互的引用 ,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象间相互连接的激增又会降低其可复用性,大量的相互连接使得一个对象似乎不太可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,而且对系统的行为进行任何较大的改动都会十分困难。结果是你不得不定义大量的子类以定制系统的行为。因此, 为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式.
例子1:

2.问题

面对一系列的相交互对象。怎么样保证使各对象不需要显式地相互引用,使其耦合松散?

3.解决方案

中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(Define an object thatencapsulates how a set of objects interact. Mediator promotesloose couplingby keeping objects fromreferring to each other explicitly, andit lets you vary their interaction independently.)

4.适用性

在下列情况下使用中介者模式:

• 1) 系统中 对象之间存在复杂的引用关系 ,产生的相互依赖关系结构混乱且难以理解。
• 2)一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
• 3)一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。
• 4) 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类 。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类。

5.结构


6.模式的组成

抽象中介者(Mediator):中介者定义一个接口用于与各同事(Colleague)对象通信。
具体中介者(ConcreteMediator):具体中介者通过协调各同事对象实现协作行为。了解并维护它的各个同事。
抽象同事类(Colleague class):定义同事类接口,定义各同事的公有方法.
具体同事类(ConcreteColleague):实现抽象同事类中的方法。每一个同时类需要知道中介者对象;每个具体同事类只需要了解自己的行为,而不需要了解其他同事类的情况。每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。

7.效果

中介者模式的优点:
1) 减少了子类生成:Mediator将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成Mediator的子类即可。这样各个Colleague类可被重用。
2) 简化各同事类的设计和实现: 它将各同事类Colleague解耦,Mediator有利于各Colleague间的松耦合. 你可以独立的改变和复用各Colleague类和Mediator类。
3) 它简化了对象协议:用Mediator和各Colleague间的一对多的交互来代替多对多的交互。一对多的关系更易于理解、维护和扩展。
4) 它对对象如何协作进行了抽象将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清 楚一个系统中的对象是如何交互的。
5) 它使控制集中化中介者模式将交互的复杂性变为中介者的复杂性。
中介者模式的缺点:
因为中介者封装了协议,即在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,这可能使得中介者自身成为一个难于维护的
庞然大物。

8.实现

<?php /** * 中介者模式 * * */ /** * 抽象中介者类 */ abstract class Mediator { static protected $_colleaguesend = array( 'ConcreteColleague1'=> 'ConcreteColleague2', 'ConcreteColleague2'=> 'ConcreteColleague3', 'ConcreteColleague3'=> 'ConcreteColleague1', ); protected $_colleagues = null; //array public function register(Colleague $colleague) { $this->_colleagues[get_class($colleague)] = $colleague; } public abstract function operation($name, $message); } /** * 具体中介者类 */ class ConcreteMediator extends Mediator { public function operation($obj, $message) { $className = self::$_colleaguesend[get_class($obj)]; if ($className == get_class($obj) ) { return ; } if ($this->_colleagues[$className]) { $this->_colleagues[$className]->notify($message); } return ; } } /** * 抽象同事类 */ abstract class Colleague { protected $_mediator = null; public function __construct($mediator) { $this->_mediator = $mediator; $mediator->register($this); } /** * 通过中介实现相互调用 */ public abstract function send($message); /** * 具体需要实现的业务逻辑代码 */ public abstract function notify($message); } /** * 具体同事类 */ class ConcreteColleague1 extends Colleague { public function __construct(Mediator $mediator) { parent::__construct($mediator); } public function send($message) { $this->_mediator->operation($this, $message); } public function notify($message) { echo 'ConcreteColleague1 m:', $message, '<br/>'; } } /** * 具体同事类 */ class ConcreteColleague2 extends Colleague { public function __construct(Mediator $mediator) { parent::__construct($mediator); } public function send($message) { $this->_mediator->operation($this, $message); } public function notify($message) { echo 'ConcreteColleague2 m:', $message, '<br/>'; } } /** * 具体同事类 */ class ConcreteColleague3 extends Colleague { public function __construct(Mediator $mediator) { parent::__construct($mediator); } public function send($message) { $this->_mediator->operation($this, $message); } public function notify($message) { echo 'ConcreteColleague3 m:', $message, '<br/>'; } } $objMediator = new ConcreteMediator(); $objC1 = new ConcreteColleague1($objMediator); $objC2 = new ConcreteColleague2($objMediator); $objC3 = new ConcreteColleague3($objMediator); $objC1->send("from ConcreteColleague1"); $objC2->send("from ConcreteColleague2"); $objC3->send("from ConcreteColleague3"); /****************************************************/

9.与其他相关模式

1)外观模式,Facade与中介者的不同之处在于它是对一个对象子系统进行抽象,从而提供了一个为方便的接口。它的协议是单向的,即 Facade对象对这个子系统类提出请求,但反之则不。相反,Mediator提供了各Colleague对象不支持或不能支持的协作行为,而且协议是多向。
2) Colleague可使用Observers模式与Mediator通信。

10.总结与分析

1)迪米特法则的一个典型应用:在中介者模式中,通过创造出一个中介者对象,将系统中有关的对象所引用的其他对象数目减少到最少,使得一个对象与其同事之间的相互作用被这个对象与中介者对象之间的相互作用所取代。因此,中介者模式就是迪米特法则的一个典型应用。
2) 通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,中介者承担了中转作用和协调作用。中介者类是中介者模式的核心,它对整个系统进行控制和协调,简化了对象之间的交互,还可以对对象间的交互进行进一步的控制。
3) 中介者模式的主要优点在于简化了对象之间的交互,将各同事解耦,还可以减少子类生成,对于复杂的对象之间的交互,通过引入中介者,可以简化各同事类的设计和实现;中介者模式主要缺点在于具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
4) 中介者模式适用情况包括:系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象;想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类

WinCC7.5SP2生成PDF报表显示有错误或残缺的问题及解决方法 WinCC V7.5 SP2 自带的生成PDF报表功能异常。生成的PDF报表内容显示空白或有残缺。经测试后发现可以通过替换Adobe PDF Library库文件的方法解决该问题。 阅读详情

相关推荐

Comsol 压电换能器声场仿真(远场分析、边界元法优化)

本文详细介绍了在Comsol中使用边界元法进行压电换能器远场声场仿真的高效方法。针对传统有限元法计算远场时内存消耗大、耗时长的问题,文章阐述了边界元法在处理无限域、提升计算效率和精确获取远场指向性方面的核心优势,并提供了从多物理场耦合设置、网格划分策略到求解器配置及结果验证的完整实战指南。

weixin_29045585的博客 408

为什么我们需要MediatR?

目录 如何使用 MediatR 为什么我们需要MediatR? 参考 单一职责 装饰器 其他功能 结论 如何使用 MediatR MediatR的基本用法非常简单。首先,安装MediatRNuGet包。在您的应用程序中,您将对要完成的工作有不同的描述(例如,创建一个ToDo项、更改用户名等)。这些描述在MediatR中称为请求。它们是实现IRequest<T>接口的简单类。这是一个没有任何成员的标记接口。 class CreateToDoItem : IRequest.

寒冰屋的专栏 2592

Libero SoC v2021.1离线安装与IP核配置全攻略

本文详细介绍了Libero SoC v2021.1在离线环境下的完整安装与配置流程。核心内容包括如何选择正确的离线安装包、获取并配置许可证、安装与挂载MegaVault IP库,以及将ModelSim仿真器切换至免费SE模式的关键步骤。文章旨在帮助内网开发者避开常见陷阱,顺利完成FPGA开发环境的搭建。

weixin_29279101的博客 409

在 C# 中使用 MediatR 实现 Mediator 模式

在这篇文章中,我们将探讨 C# 中介模式的实现。要掌握中介模式的概念及其用例,我建议阅读我之前的博客。随着时间的推移,将调解器合并到应用程序中可能会导致复杂性增加。对于较小的应用程序,采用多种设计模式可能会引入不必要的复杂性。然而,随着应用程序的扩展,积累业务逻辑并遵守 KISS(保持简单、愚蠢)和 DRY(不要重复自己)等原则可能涉及在服务或经理之间直接调用。虽然依赖项注入可以解决紧密耦合问题,...

dotNET跨平台 1601

统信UOS专业版服务器无人值守安装

(2)、专业版:主要针对整机厂商、政府单位、事业单位和企业用户使用,cpu目前支持x86、arm、mips、sw64和LoogngArch架构,试用期免费获得90天的使用,随后需要单位采购授权,获得正式激活码后才可以正常使用。其中企业版代号为d,行业版为a/c,欧拉版则为e,在最近的更新中,c版已经停止更新迭代,后续行业版本将都为a版,版本代号体现在镜像名字中以及版本号上,例如1050d则表示企业版1050版本。UOS系统服务器版本分为:专业版(d版)、行业版(a版)、欧拉版(e版)

靠谱运维 2252

ARM架构下的SLAM部署避坑指南:香橙派AIpro与D435i深度相机的实战解析

本文详细解析了在ARM架构的香橙派AIpro开发板上部署SLAM算法并与Intel D435i深度相机配合的实战经验。内容涵盖系统配置、ROS编译、驱动安装、算法优化等关键步骤,提供了具体的避坑指南和性能调优技巧,帮助开发者在嵌入式平台上高效实现实时SLAM应用。

f0g1h2的博客 983

.NET中的中介者框架 - MediatR(实现进程内的消息传递)

MediatR 是一个轻量级的开源库,为 .NET 开发人员提供了一种简单的方式来实现基于中介者模式的应用程序设计。该库的主要目标是使开发人员能够编写易于维护和可扩展的应用程序。

KoJuju的博客 2475

说一下Intel Fortran 编译器经典版ifort和新一代ifx

摘要:ifort是Intel开发的传统Fortran编译器,以稳定性和遗留代码兼容性著称,现已进入维护模式。ifx则是基于LLVM架构的新一代Fortran编译器,具有更好的性能优化、更快的编译速度,并支持最新Fortran标准和GPU加速。英特尔计划逐步用ifx取代ifort,前者将成为未来主力发展的产品线。两者的核心区别在于技术基础(传统vs.现代化LLVM)和功能支持(维护状态vs.持续更新)。

luohaitao的专栏 1347

C# .NET 8 — 使用 MediatR 流式传输请求和管道

MediatR 是一个库,它自称为“.NET 中的简单调解器实现”。(本文源代码文末提供下载)在本文中,我们将探讨 MediatR 中请求的异常处理过程,特别关注 MediatR 实体只有一个接收方的场景。有关MediatR的进一步见解,请随时浏览我就此主题撰写的其他文章。流请求普通请求可用于命令和查询操作。流请求专门设计用于使用 MediatR 检索一组流数据。为了使用 Mediator 处理流...

dotNET跨平台 1503

K8s认证文件丢失的应急处理与恢复策略

本文详细介绍了Kubernetes(K8s)认证文件丢失时的应急处理与恢复策略。从快速诊断问题范围到不同场景的临时解决方案,再到深度恢复方案(无损重建、部分重置、完全重建),提供了全面的操作指南。同时强调了生产环境中的防丢失设计、高可用集群的特殊处理以及日常运维建议,帮助运维人员有效应对认证文件丢失的紧急情况。

weixin_33743248的博客 327

从 AI 助手到 ADT 自动化桥梁:全面解析 Vibing Steampunk 的定位、能力边界与典型使用场合

Vibing Steampunk是一个面向SAP ABAP开发的AI自动化工具集,它通过ADT API将SAP开发能力系统化地暴露给AI助手和命令行工作流。该工具支持ECC、S/4HANA等所有启用ADT的系统,提供代码读取、修改、测试、调试等全流程自动化能力。核心功能包括AI调试、上下文压缩、ABAP语言服务、Lua脚本自动化等,并内置多重安全控制。其分层架构兼容标准ADT和WebSocket扩展,既适合AI驱动开发,也支持传统DevOps自动化,特别适用于老系统代码考古、知识接力和复杂问题诊断场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 152

设计模式 十五 中介者模式Mediator(对象行为型)

设计模式 十五 中介者模式Mediator(对象行为型)

skiwnc的博客 237

【硬件的单元测试 UT 3】PCIe 3.0及信号完整性测试方法

PCIe标准自从推出以来,1代和2代标准已经在PC和Server上逐渐普及,用于满足高速显卡、高速存储设备对于高速数据传输的要求。出于支持更高总线数据吞吐率的目的,PCI-SIG组织在2010年制定了PCIe 3.0,即PCIe 3代的规范,数据速率达到8Gbps。

qq_43416206的博客 1415

【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。...

weixin_34144450的博客 70

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

设计模式学习(十五):Mediator

这一篇博客主要记录了Mediator模式的学习。

qq_43110851的博客 195

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式(十五)中介者模式

版权声明:转载必须注明本文转自晓_晨的博客:http://blog.youkuaiyun.com/niunai112 目录 目录 导航 前言 例子 总结 优点 缺点 Git地址 导航 设计模式之六大设计原则 设计模式(一)单例模式 设计模式(二)工厂模式 设计模式(三)策略模式 设计模式(四)适配器模式 设计模式(五)享元模式 设计模式(六...

晓晨的博客 3454

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

【每天一个java设计模式(二十一)】 - 中介者模式

中介者模式定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。 中介者模式的实现: 1. 创建一个Person类 //一个用户 public class Person { private String name; public String getName() { return name; } public void setName(String name)

1+1=王的博客 4083

行为型设计模式总结

Template Method模板:动机:在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变需求,或者由于故有的原因(比如框架与应用之间)而无法和任务的整体结构同时实现。Template Method意图:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。Templ

Nicholas黎的专栏 2497
上一篇: Ubuntu12.04下eclipse提示框黑色背景色的修改方法
下一篇: 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
piperzero
博客等级 码龄21年 1377粉丝 504原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值