【行为型】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)模式
一. 举例 比如,现在中图和日本在关于钓鱼岛问题上存在争端.这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者.发言人. 结构图如下: ...
随机推荐
- 汇编学习笔记(3)[bx]和loop
本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...
- CodeForces 595B
题目链接: http://codeforces.com/problemset/problem/595/B 题意: 有一个n位的电话号码,每位电话号码将分成n/k段,每段均为k个数,求出满足以下要求的电 ...
- Vagrant网络配置
Vagrant中网络配置 一.基本配置 Vagrant offers multiple options for how you are able to connect your guest machi ...
- Fire Net(深搜 和一前不一样的深搜)
/* http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1162 本题妙处: 用一个数对行取商是 ...
- poj1013
题目大意:假造的银币 Sally Jones有一些游客给的银币,但是只有11枚是真正的银币(有一枚是假的),从颜色和大小是无法区分真比还是假币的,但是它的重量和真币是不同的,Sally Jones它是 ...
- 每一个web开发者都应该了解的HTTP/2
我认为每一个 web 开发者都应该对这个支撑了整个 Web 世界的 HTTP 协议有所了解,这样才能帮助你更好的完成开发任务.在这篇文章中,我将讨论什么是 HTTP,它是怎么产生的,它的地位,以及我们 ...
- Redis 与 Memcached 的区别
[转]Redis 与 Memcached 的区别 传统 MySQL + Memcached 架构遇到的问题 实际上 MySQL 是适合进行海量数据存储的,通过 Memcached 将热点数据加 ...
- Python判断上传文件类型
在开发上传服务时,经常需要对上传的文件进行过滤. 本文为大家提供了python通过文件头判断文件类型的方法,非常实用. 代码如下 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- Android WebView Error – Uncaught TypeError: Cannot call method ‘getItem’ of null at
本质原因是js 没有判断dom 是否加载完毕 其实就是在dom 加载完毕之后处理事件 wv.getSettings().setDomStorageEnabled(true); 转自 蛙齋 http: ...
- [Javascript] Proper use of console.assert in JavaScript
Learn about console.assert, which is syntactic sugar for logging an error the console when a given c ...