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

    说明: 创建Servlet的方式,在上篇博客中,已经用了方式1(实现Servlet接口),接下来本节讲的是另外2种方式. 上篇博客地址:http://blog.csdn.net/qq_26525215 ...

  2. leetcode reverse integer&&Palindrome Number

    public class Solution { public int reverse(int x) { int ret=0; while(x!=0) { int t=x%10; ret=ret*10+ ...

  3. Joomla的在线视频播放插件:AllVideos

    一个很好的插件,只需要在文章中插入一条简单的语句就可以实现视频播放,视频可以位于网站服务器上或其他视频网站的. 例如:{f4v}ShaHua-H264{/f4v}   我在使用中只有一个地方觉得需要更 ...

  4. Dijkstra算法构造单源点最短路径

    迪杰斯特拉(Dijkstra)算法 是求从某个源点到其余各顶点的最短路径,即对已知图 G=(V,E),给定源顶点 s∈V,找出 s 到图中其它各顶点的最短路径. 我总结下核心算法,伪代码如下: Dij ...

  5. linux ant 解决 错误: 找不到或无法加载主类 org.apache.tools.ant.launch.Launcher

    在使用ant进行java程序编译的时候出错.错误提示: Error: Could not find or load main class org.apache.tools.ant.launch.Lau ...

  6. Kbuild文件

    3 Kbuild文件 大部分内核中的Makefile都是使用Kbuild组织结构的Kbuild Makefile.这章将介绍Kbuild Makefile的语法. 对于Kbuild文件名来讲,Kbui ...

  7. puppet任务计划

  8. 【python自动化第六篇:面向对象】

    知识点概览: 面向对象的介绍 面向对象的特性(class,object)实例变量,类变量 面型对象编程的介绍 其他概念 一.面向对象介绍 编程范式:面向对象,面向过程,函数式编程 面向过程:通过一组指 ...

  9. Android基础知识回顾

  10. Java为何大行其道

    Java为何大行其道 --专訪传智播客冯威老师 冯威老师,多年来一直从事软件开发和教学工作.先后担任过项目经理.软件架构师.软件开发project师.系统架构师.讲师等.具备丰富的软件开发经验和教学经 ...