【行为型】Mediator模式
中介者模式目的是将对象间的交互封装在一个对象中,从而使用各对象间的相互依赖解耦,并可以独立更改对像间的交互。在实际项目开发过程中,因某些原因(如:业务逻辑处理不当或设计不当等)使得多个不同对象间需要相互(引用)访问,无形当中使得原本几个不相干的或相对较为独立的几个模块产生了相互依赖。随着依赖程度的恶化,后期项目维护将是十分被动的。举个大家可能平时都有遇到过的例子,A界面点击了某个按钮,导致B界面需要关掉。许多人(尤其是新手程序员)总是在A界面的按钮事件响应时调用了B界面的close()行为。接着可能又由于某些需求,B界面的某些行为执行时,会影响到A、C界面等等,明显的,原本这些不相干的界面现在都产生了相互依赖,如此必定会影响后期的维护。此时,一种解决手段就可以使用该中介者模式。先看下没有使用中介者模式与使用中介者模式两种情况的对象交互情况。


由上所述可明显看出该模式的目的意图,下面是中介者模式的类关系图参考结构:

模式的编码结构参考如下:
namespace mediator
{
//
// 此处只设计简单的中介者对象,如果有必要,Mediator的设计,完全可以考虑使用Observer
// 模式来设计。使用Observer模式来设计Mediator,则相对会更通用些,当然设计也相对更为
// 复杂些。如果实际情况较为简单时,则只需要使用简单方式实现Mediator即可(参考如下)。
// // 各模块对象类型
class ModuleA {};
class ModuelB {};
class ModuelC
{
public:
void doSomething() {}
};
class ModuelD
{
public:
void doSomething() {}
};
class ModuelE {}; // 中介者对象类型,此处不再弄个基类.
class Mediator
{
public:
void actionA() {
// some code here.such as below.
m_pModuleC->doSomething();
m_pModuleD->doSomething();
}
// some other code here........ private:
ModuleA* m_pModuleA;
ModuelB* m_pModuleB;
ModuelC* m_pModuleC;
ModuelD* m_pModuleD;
ModuelE* m_pModuleE;
}; }//namespace mediator
Mediator模式编码结构参考
Mediator模式重在将几个处于“同级别”(或称为同层次结构上)的模块对象的依赖解耦。即:如上的各个模块间,它们并不存在明显的上下层次关系,它们是处于同一层次层面的对象。比如两个维护着不同模块的数据的数据维护对象class ClanDataMgr;和class ChatDataMgr;一般情况下,这两个对象间是没有交集的,但由于某些原因,开发者让他们间产生了交集(注意:这只是个举例而已)。之前在介绍结构型模式时,也有一个模式也是解决类似这种依赖性错综复杂的依赖关系问题,该模式是:Facade模式。但Facade模式意图是将应用对子系统的依赖解耦,即:应用与子系统间是存在明显的上下层依赖关系,这也是Facade模式与Mediator模式的不同之处。
在设计Mediator时,如果实际情况较为复杂,还需要考虑日后交互的变动。比如可参考上述类关系参考图中的抽象IMediaotr设计方案,又或者考虑使用Strategy模式方案等等。如果实际情况较为简单,模块对象间的交互又相对较为固定,则使用简单设计Mediator即可。实际如果设计,最终还是视具体项目情况分析而定。
【行为型】Mediator模式的更多相关文章
- 设计模式--中介(Mediator)模式
时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...
- Facade模式和Mediator模式
相同的目的:把某种策略施加到另一组对象上. Facade从上面施加策略. 其使用是明显且受限的.当策略涉及范围广泛并且可见时. 约定的关注点.都同意使用Facade而不是隐藏于其下的对象. Media ...
- 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考
http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...
- Mediator 模式
在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信.在系统比较小的时候,可能对象间的通信不是很多.对象也比较少,我们可以直接硬编码到各个对象的方法 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- Mediator模式
[Mediator模式] 通过mediator来让各个相互通知的对象解耦.在iOS框架中就是NSNotificationCenter. 参考:http://www.jdon.com/designpat ...
- Mediator模式(仲裁者设计模式)
Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...
- 设计模式(十六)Mediator模式
在实际的工作小组的交流过程是,组员向仲裁者报告,仲裁者向组员下达指示,组员之间不再互相询问和指示.Mediator模式是指,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. ...
- 设计模式C++描述----18.中介者(Mediator)模式
一. 举例 比如,现在中图和日本在关于钓鱼岛问题上存在争端.这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者.发言人. 结构图如下: ...
随机推荐
- NOI题库192 生日蛋糕
192:生日蛋糕 总时间限制: 5000ms 内存限制: 65536kB 描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i ...
- python--把一个方法变成属性调用
# coding=utf-8 ''' 装饰器(decorator)可以给函数动态加上功能,对于类的方法,装饰器一样起作用.Python内置的@property装饰器就是负责把一个方法变成属性调用的: ...
- Ueditor 1.4.3 jsp utf-8版图片上传问题
- .NET 基础 一步步 一幕幕[面向对象之new、this关键字]
经常会有人问:小伙子,有没有对象啊,要不要大叔我帮你介绍一个啊,小伙子会说:大叔,不用我自己new一个就好了.(PS:活该你没有对象) 上边当然是一个段子咯,程序员那会没有对象,自己new一个就有了啊 ...
- 基于RMAN的异机数据库克隆(rman duplicate)
对于基于生产环境下的数据库的版本升级或者测试新的应用程序的性能及其影响,备份恢复等等,我们可以采取从生产环境以克隆的方式将其克隆到本地而不影响生产数据库的正常使用.实现这个功能我们可以借助rman d ...
- MVC 无法将类型“System.Collections.Generic.List<AnonymousType#1>”隐式转换为“System.Collections.Generic.IList<Mvc3Modeltest.Models.Movie>”。存在一个显式转换(是否缺少强制转换?))
1.问题: 2.解决方案:强制指定类型. 解决之.
- Android系统移植与驱动开发——第六章——使用实例来理解Linux驱动开发及心得
Linux驱动的工作方式就是交互.例如向Linux打印机驱动发送一个打印命令,可以直接使用C语言函数open打开设备文件,在使用C语言函数ioctl向该驱动的设备文件发送打印命令.编写Linux驱动最 ...
- android 安全退出应用程序的几种方法
android 安全退出应用程序的几种方法 正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程.a ...
- IOS 开发 【序】
首先说说环境的搭建: 需要有一台搭载开发环境的电脑 其实简单的设备就行,不过好的设备会提高开发效率. 有了设备,剩下的就是需要集成开发环境. 去 app store 下载最新的 xcode. 安装上x ...
- 在imge控件中直接显示图片(图片是byte[]格式)
在工作过程中遇到了这个问题,在网上查了一些资料,结合自己的解决方法及解决过程总结了下,方面以后查阅.如果能帮到同样遇到这个问题的你,将非常高兴哦~_~ 由于asp.net中的Image控件是在Syst ...