在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。在系统比较小的时候,可能对象间的通信不是很多、对象也比较少,我们可以直接硬编码到各个对象的方法中。但是当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 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. 上海Uber优步司机奖励政策(2月1日~2月7日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. asp.net将本地Excel上传到服务器并把数据导入到数据库

    前台代码: <td class="formLabel"> 批量修改: </td> <td class="formInput"> ...

  3. [置顶] 文件io(一)--unix环境高级编程读书笔记

    unix-like(后面以linux为例)系统中的文件操作只需要五个函数就足够了,open.close.read.write以及lseek.这些操作被称为不带缓存的io,这里有必要说一下带缓存和不带缓 ...

  4. Plinq-Parallel.ForEach for 性能提升

    https://msdn.microsoft.com/zh-cn/library/dd460720.aspx 本示例显示如何使用 Parallel.ForEach 循环对任何 System.Colle ...

  5. CoreJava_线程并发(堵塞队列):在某个目录下搜索含有某keyword的文件

    Java多线程编程是很考验一个程序猿水平的. 传统的WEB程序中.由于框架提供了太多的健壮性.并发性.可靠性的支持,所以我们都是将全部的注意力放到了业务实现上.我们不过依照业务逻辑的要求.不停的积累自 ...

  6. BTrace使用总结

    btracejvisualvmhotswap  一.背景        在生产环境中可能经常遇到各种问题,定位问题需要获取程序运行时的数据信息,如方法参数.返回值.全局变量.堆栈信息等.为了获取这些数 ...

  7. 启动MYSQL密码审计插件

    http://www.innomysql.com/article/25717.html [root@server-mysql plugin]# pwd /usr/local/mysql56/lib/p ...

  8. CentOS 7.2 修改主机名

    1.临时修改主机名 hostname 主机名 重新连接shell,就可以,这种方式,只能修改临时的主机名,当重启机器后,主机名称又变回来了. 2.永久修改主机名 hostnamectl set-hos ...

  9. linux 安装软件的地方

    用下边这个命令:mysqladmin -u root -p variables root是你的数据库帐号回车后会提示你输入密码,输入上边填写的帐号对应的密码 回车后出来一个大表,找到datadir这一 ...

  10. 常用JDBC连接字符串

    1.MySQL Class.forName( " org.gjt.mm.mysql.Driver " ); Connection conn = DriverManager.getC ...