中介者模式(Mediator)
GOF:用一个中介对象来封装一系列的对象交互。中介者使对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
类图:
适用性:
- 一组对象以定义良好但是复杂的方式进行通信。因为这组类之间的相互关系错综复杂,如果直接管理会十分困难,因此利用中介者管理它们的关系,而Client只需要知道中介者的接口即可。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
优缺:
- 减少了子类的生成。
- 它将各Colleague解耦。
- 它简化了对象协议。由多对多变成一对多。
- 它对对象如何写作进行了抽象。将注意力从对象各自本身的行为转移到它们之间的交互上来。
- 它使控制集中化。将对象间交互的复杂性变为中介者的复杂性,可能使得中介者自身成为一个难于维护的庞然大物。
模板代码:
#include <iostream>
#include <string>
using namespace std;
class Colleague;
class Mediator {
public:
;
};
class Colleague {
public:
Colleague(Mediator *pMediator) { m_pMediator = pMediator; }
void notify(string message) { cout << "Got message : " << message << endl; }
protected:
Mediator *m_pMediator;
};
class ConcreteColleague1 : public Colleague {
public:
ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator) {}
void send(string message) { m_pMediator->send(message, this); }
void notify(string message) { cout << "Colleague1 got message : " << message << endl; }
};
class ConcreteColleague2 : public Colleague {
public:
ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator) {}
void send(string message) { m_pMediator->send(message, this); }
void notify(string message) { cout << "Colleague2 got message : " << message << endl; }
};
class ConcreteMediator : public Mediator {
public:
void setColleague1(ConcreteColleague1 *pColleague1) {
m_pColleague1 = pColleague1;
}
void setColleague2(ConcreteColleague2 *pColleague2) {
m_pColleague2 = pColleague2;
}
void send(string message, Colleague *pColleague) {
if(pColleague == m_pColleague1) {
m_pColleague2->notify(message);
}
else {
m_pColleague1->notify(message);
}
}
private:
ConcreteColleague1 *m_pColleague1;
ConcreteColleague2 *m_pColleague2;
};
int main() {
ConcreteMediator *pcm = new ConcreteMediator();;
ConcreteColleague1 *pc1 = new ConcreteColleague1(pcm);
ConcreteColleague2 *pc2 = new ConcreteColleague2(pcm);
pcm->setColleague1(pc1);
pcm->setColleague2(pc2);
pc1->send("message from pc1");
delete pcm; delete pc1; delete pc2;
;
}
中介者模式就是封装了多个类之间的交互,使得我们不需要直接在多个类之间手动弄交互。
如下所示:
但是这样就使得中介者变得复杂了,需要小心管理。
中介者模式(Mediator)的更多相关文章
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 中介者模式(Mediator Pattern)
用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
- 18.中介者模式(Mediator Pattern)
using System; namespace Test { class Program { /// <summary> /// 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关 ...
- 大熊君说说JS与设计模式之------中介者模式Mediator
一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...
- 设计模式-中介者模式(Mediator)
场景分析: 众所周知,电脑有很多组成部分,如硬盘.内存.光驱.音频.键盘等,各个组件之间协同工作才能保证电脑的正常运行. 如果各个组件之间直接交互,可能会比较复杂,如下图: 将上面的各个组件抽象成类, ...
随机推荐
- js:方法3. 对象
Object.constructor object.constructor a = new Array(1,2,3); // Create an object a.constructor == Arr ...
- 泛型容器单元(Generics.Collections)[3]: TStack<T> 堆栈列表
TQueue 和 TStack, 一个是队列列表, 一个是堆栈列表; 一个是先进先出, 一个是先进后出. TStack 主要有三个方法.一个属性:Push(压栈).Pop(出栈).Peek(查看下一个 ...
- 块级元素和内联元素的区别(HTML)
请把下面二行代码放进body标签里: <div style=”border: 1px solid red;”>div1</div> <div style= ...
- zjoi2016 day1【bzoj4455】【bzoj4456】
首先做了T2的旅行者,看到bz上面过的人数比较多.. 考试的时候完全没有想太多.一闪而过了分块思想,然后就没有然后了.. 大视野上面有题解,竟然是一个初中生写的..? 正解其实是“分治”,每次选择中轴 ...
- Golang 安装及配置教程 for Mac
1.到golang.org下载golang 并安装. 2.安装sublimetext ,打开之后 按ctrl+` 打开命令行,输入以下内容: import urllib2,os; pf='Packag ...
- UpdatePanel的使用
一.UpdatePanel的结构 <asp:ScriptManager ID="ScriptManager1" runat="server" > & ...
- css3 使用SVG做0.5px 的边框细线
.HalfPixelLine{ background: repeat-x top left url("data:image/svg+xml;utf8,<svg xmlns='http: ...
- Android MultiDex
出现的原因: 当Android系统安装一个应用的时候,有一步是对Dex进行优化,这个过程有一个专门的工具来处理,叫DexOpt.DexOpt的执行过程是在第一次加载Dex文件的时候执行的.这个过程会生 ...
- js两个小技巧【看到了就记录一下】
1.不声明第三个变量实现交换 ,b=; a=[b,b=a][];//执行完这句代码之后 a的值为2 b的值为1了 2.&&和||的用法 (学会了立马感觉高大尚了吧) ; //传统if语 ...
- XCODE shouldAutorotateToInterfaceOrientation 对于不同版本 设备旋转不同方向时 视图的相应旋转方向的实现
对于版本号不同的设备,旋转时视图的要做出相应的旋转,那么版本不同,代码的实现是如何的,如何对旋转方向做出限制?下面是小编的个人看法! //版本号为3.5 -5.0 -(BOOL)shouldAutor ...