在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。在系统比较小的时候,可能对象间的通信不是很多、对象也比较少,我们可以直接硬编码到各个对象的方法中。但是当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式

 //////////Colleage.h////////////////////////////////////////////////////////////////
#pragma once
#include <string>
using namespace std;
class Mediator ;
class Colleage
{
public:
virtual ~Colleage();
virtual void Action() = ;
virtual void SetState(const string& sdt) = ;
virtual string GetState() = ; protected:
Colleage();
Colleage(Mediator* mdt);
Mediator* _mdt ; private:
}; class ConcreteColleageA : public Colleage
{
public:
~ConcreteColleageA();
ConcreteColleageA();
ConcreteColleageA(Mediator* mdt);
void Action();
void SetState(const string& sdt);
string GetState(); protected:
private:
string _sdt ;
}; class ConcreteColleageB : public Colleage
{
public:
~ConcreteColleageB();
ConcreteColleageB();
ConcreteColleageB(Mediator* mdt);
void Action();
void SetState(const string& sdt);
string GetState(); protected:
private:
string _sdt ;
};
 ///////////Mediator.h///////////////////////////////////////////////////////////////
#pragma once
class Colleage;
class Mediator
{
public:
virtual ~Mediator();
virtual void DoActionFromAtoB() = ;
virtual void DoActionFromBtoA() = ;
protected:
Mediator();
private:
}; class ConcreteMediator : public Mediator
{
public:
~ConcreteMediator();
ConcreteMediator();
ConcreteMediator(Colleage* clgA ,Colleage* clgB); void SetColleageA( Colleage* clgA );
void SetColleageB( Colleage* clgB ); Colleage* GetColleageA();
Colleage* GetColleageB(); void IntroColleage(Colleage* clgA ,Colleage* clgB); void DoActionFromAtoB();
void DoActionFromBtoA();
protected:
private:
Colleage* _clgA ;
Colleage* _clgB ;
};
 ////////////Colleage.cpp//////////////////////////////////////////////////////////////
#include "Colleage.h"
#include "Mediator.h"
#include <string>
#include <iostream>
using namespace std;
Colleage::~Colleage()
{ }
Colleage::Colleage()
{ }
Colleage::Colleage(Mediator* mdt)
{
this->_mdt = mdt ;
} ConcreteColleageA::~ConcreteColleageA()
{ }
ConcreteColleageA::ConcreteColleageA()
{ }
ConcreteColleageA::ConcreteColleageA(Mediator* mdt):Colleage(mdt)
{ }
void ConcreteColleageA::SetState(const string& sdt)
{
this->_sdt = sdt ;
}
string ConcreteColleageA::GetState()
{
return _sdt ;
} void ConcreteColleageA::Action()
{
this->_mdt->DoActionFromAtoB();
cout<<"把消息:"<<this->GetState()<<"传给B"<<endl;
} ConcreteColleageB::~ConcreteColleageB()
{ }
ConcreteColleageB::ConcreteColleageB()
{ }
ConcreteColleageB::ConcreteColleageB(Mediator* mdt):Colleage(mdt)
{ }
void ConcreteColleageB::SetState(const string& sdt)
{
this->_sdt = sdt ;
}
string ConcreteColleageB::GetState()
{
return _sdt ;
} void ConcreteColleageB::Action()
{
this->_mdt->DoActionFromBtoA();
cout<<"把消息:"<<this->GetState()<<"传给A"<<endl;
}
 //////////Mediator.cpp////////////////////////////////////////////////////////////////
#include "Mediator.h"
#include "Colleage.h"
Mediator::Mediator()
{ }
Mediator::~Mediator()
{ } ConcreteMediator::ConcreteMediator()
{ }
ConcreteMediator::~ConcreteMediator()
{ }
ConcreteMediator::ConcreteMediator(Colleage* clgA ,Colleage* clgB)
{
_clgA = clgA ;
_clgB = clgB ;
}
void ConcreteMediator::DoActionFromAtoB()
{
_clgB->SetState(_clgA->GetState());
}
void ConcreteMediator::DoActionFromBtoA()
{
_clgA->SetState(_clgB->GetState());
} void ConcreteMediator::SetColleageA( Colleage* clgA )
{
_clgA = clgA ;
}
void ConcreteMediator::SetColleageB( Colleage* clgB )
{
_clgB = clgB ;
}
Colleage* ConcreteMediator::GetColleageA()
{
return _clgA ;
}
Colleage* ConcreteMediator::GetColleageB()
{
return _clgB ;
} void ConcreteMediator::IntroColleage(Colleage* clgA ,Colleage* clgB)
{
_clgA = clgA ;
_clgB = clgB ;
}
 //////main.cpp////////////////////////////////////////////////////////////////////
#include "Colleage.h"
#include "Mediator.h"
#include <iostream>
using namespace std;
int main()
{
ConcreteMediator* m = new ConcreteMediator();
Colleage* c1 = new ConcreteColleageA(m);
Colleage* c2 = new ConcreteColleageB(m); m->IntroColleage(c1, c2);
c1->SetState("你好!");
c2->SetState("你是谁"); cout<<c1->GetState()<<endl;
cout<<c2->GetState()<<endl; c1->Action(); cout<<c2->GetState()<<endl;
getchar();
return ; }

Mediator 模式的更多相关文章

  1. 设计模式--中介(Mediator)模式

    时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...

  2. Facade模式和Mediator模式

    相同的目的:把某种策略施加到另一组对象上. Facade从上面施加策略. 其使用是明显且受限的.当策略涉及范围广泛并且可见时. 约定的关注点.都同意使用Facade而不是隐藏于其下的对象. Media ...

  3. 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考

    http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...

  4. 【行为型】Mediator模式

    中介者模式目的是将对象间的交互封装在一个对象中,从而使用各对象间的相互依赖解耦,并可以独立更改对像间的交互.在实际项目开发过程中,因某些原因(如:业务逻辑处理不当或设计不当等)使得多个不同对象间需要相 ...

  5. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  6. Mediator模式

    [Mediator模式] 通过mediator来让各个相互通知的对象解耦.在iOS框架中就是NSNotificationCenter. 参考:http://www.jdon.com/designpat ...

  7. Mediator模式(仲裁者设计模式)

    Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...

  8. 设计模式(十六)Mediator模式

    在实际的工作小组的交流过程是,组员向仲裁者报告,仲裁者向组员下达指示,组员之间不再互相询问和指示.Mediator模式是指,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. ...

  9. 设计模式C++描述----18.中介者(Mediator)模式

    一. 举例 比如,现在中图和日本在关于钓鱼岛问题上存在争端.这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者.发言人. 结构图如下: ...

随机推荐

  1. 今天遇到的mouseout和mouseleave之坑

    时间紧  简短的说就是: mouseout是离开其子元素也会触发 mouseleave是离开指定的那个元素才触发

  2. HTML5与CSS3权威指南.pdf1

    第2章 HTML5与HTML4的区别 HTML5的文件扩展符与内容类型保持不变仍为“.html”或“.htm”,内容类型(ContentType)仍为“text/html” DOCTYPE声明: HT ...

  3. Eclipse 下载与安装(2014.12.26——by小赞)

    Eclipse网站首页:http://www.eclipse.org/home/index.php Eclipse下载页网址:http://www.eclipse.org/downloads/ 步骤一 ...

  4. 打印从1到k之间的所有素数

    问题分析:素数是指大于1且只能被它本身和1整除的数,根据定义可以从2开始对一个数取余数一直到它本身,若它有第三个整除数,则可以判定它不是素数.若使用这种方法,会浪费时间,我们可以判断2到这个数的算术平 ...

  5. YII 表单验证规则

    官方文档:http://www.yiichina.com/guide/form.model 类参考手册:http://www.yiichina.com/api/CValidatorhttp://www ...

  6. db2 identity列重置,reset/restart

    db2中可以对表中的某一个列创建identity列,用于自动填充值,某些情况下(比如删除数据后,需要从最小值开始,并不重复,那可以对标识列进行reset操作) 语法: ALTER TABLE < ...

  7. asp.net redis 实战

    当开始用    var result=new RedisClient("127.0.0.1",6379,1"1111");  这个helper ,后面有并发之后 ...

  8. uva 1030 - Image Is Everything(迭代更新)

    题目链接:uva 1030 - Image Is Everything 题目大意:有一个最大为n*n*n的立方体的一个不规整立体,由若干个1*1*1的小正方体构成(每一个小正方体被涂成不同的颜色),给 ...

  9. CSS Sprites的详细使用步骤

    一.把小图放在一张大图中,先排版好.上几张图看看,就比如这个: 谷歌: 淘宝: 土豆右下角悬浮框: 1.把用到的小图都放到了一张大图里,其中的小图之间的排版是有点规律的,比如说淘宝那张,类似的小图放置 ...

  10. C#中npoi操作Excel[版本2.0.1读写2003、2007格式]

    下载npoi2.0.1dll文件:http://download.csdn.net/detail/pukuimin1226/5851747 public static void test1()     ...