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

    同步 之前用的 Keepass 1.x, 要实现工作电脑和个人电脑上的数据库文件同步,使用的是第三方的网盘同步.但有个问题就是,个人不习惯设置同步网盘开机启动,所以有时候工作电脑上的改动还没有同步上传 ...

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

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

  3. HW4.21

    import java.util.Scanner; public class Solution { public static void main(String[] args) { Scanner i ...

  4. 操作12864(ST7920控制器)

    引脚部分查看中文的12864介绍,下面这些可以在ST7920的英文数据手册里查到. Function Description 部分介绍工作方式.存储器.操作方法.Instructions 部分介绍指令 ...

  5. checkbox in iOs

    UIButton *checkbox; BOOL checkBoxSelected; checkbox = [[UIButton alloc] initWithFrame:CGRectMake(x,y ...

  6. Linux内核是如何创建一个新进程的?

    进程描述 进程描述符(task_struct) 用来描述进程的数据结构,可以理解为进程的属性.比如进程的状态.进程的标识(PID)等,都被封装在了进程描述符这个数据结构中,该数据结构被定义为task_ ...

  7. ROS学习笔记(九)——ROSSERVICE

    NEW 1 $ roscore NEW 2 $ rosrun turtlesim turtlesim_node NEW 3 $ rosrun turtlesim turtle_teleop_key N ...

  8. [TypeScript] Using Exclude and RootDir until File Globs Lands in 2.0.

    Files globs will be available in TypeScript 2.0, so in the meantime, we need to use "exclude&qu ...

  9. [Redux] Wrapping dispatch() to Log Actions

    We will learn how centralized updates in Redux let us log every state change to the console along wi ...

  10. NVMe 图解

    http://www.ssdfans.com/?p=1143#rd&sukey=3997c0719f151520989740bb972a716fdb2dbab623808d16acd5075b ...