Mediator 模式
在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。在系统比较小的时候,可能对象间的通信不是很多、对象也比较少,我们可以直接硬编码到各个对象的方法中。但是当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 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 模式的更多相关文章
- 设计模式--中介(Mediator)模式
时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...
- Facade模式和Mediator模式
相同的目的:把某种策略施加到另一组对象上. Facade从上面施加策略. 其使用是明显且受限的.当策略涉及范围广泛并且可见时. 约定的关注点.都同意使用Facade而不是隐藏于其下的对象. Media ...
- 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考
http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...
- 【行为型】Mediator模式
中介者模式目的是将对象间的交互封装在一个对象中,从而使用各对象间的相互依赖解耦,并可以独立更改对像间的交互.在实际项目开发过程中,因某些原因(如:业务逻辑处理不当或设计不当等)使得多个不同对象间需要相 ...
- Java设计模式(16)中介模式(Mediator模式)
Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...
- Mediator模式
[Mediator模式] 通过mediator来让各个相互通知的对象解耦.在iOS框架中就是NSNotificationCenter. 参考:http://www.jdon.com/designpat ...
- Mediator模式(仲裁者设计模式)
Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...
- 设计模式(十六)Mediator模式
在实际的工作小组的交流过程是,组员向仲裁者报告,仲裁者向组员下达指示,组员之间不再互相询问和指示.Mediator模式是指,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者. ...
- 设计模式C++描述----18.中介者(Mediator)模式
一. 举例 比如,现在中图和日本在关于钓鱼岛问题上存在争端.这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者.发言人. 结构图如下: ...
随机推荐
- slua 中使用 lua5.3
因为我们服务器极有可能要迁移到 skynet 上,它基于 lua5.3,而服务器和客户端会公用很多lua代码,所以在考虑在客户端 slua 中使用 lua5.3. 经过编译后,发现 slua 对 lu ...
- Tomcat启动失败闪退
最近把电脑系统从win8升到了8.1(之前源于各种原因都没升外带升级失败),用都用了1个月了,突然发现tomcat启动不了,提示找不到什么什么- -,因为平时基本都是从开发工具里运行的服务器,都没有问 ...
- [洛谷U871]building
题目来源:http://www.luogu.org/problem/show?pid=U871# [题目背景 Background] WOW是BLIZZARD公司开发的一款网络游戏,游戏的背景是处在一 ...
- JDBC_demo:java连接mysql过程
1.任何数据库驱动程序都提供对java.sql.Driver接口的驱动类,mysql-connector-java-5.1.39-bin.jar中Driver: package com.mysql.j ...
- MySQL外键约束On Delete、On Update各取值的含义
主键.外键和索引的区别? 主键 外键 索引 定义: 唯一标识一条记录,不能有重复的,不允许为空 表的外键是另一表的主键, 外键可以有重复的, 可以是空值 主索引(由关键字PRIMARY定义的索引) ...
- 学习动态性能表 v$sql
学习动态性能表 第三篇-(1)-v$sql V$SQL中存储具体的SQL语句. 一条语句可以映射多个cursor,因为对象所指的cursor可以有不同用户(如例1).如果有多个cursor(子游标)存 ...
- Linq中Take、TakeWhile、Skip、SkipWhile的比较(转)
参考文章:http://blog.csdn.net/lxfzgg/article/details/20534281 Take() , , , , , , , , , }; ); //从第一个元素开始, ...
- array_column php 函数
今天想从二维数组中取某个列成一维数组 结果发现 array_column需要php5.5支持才行 然后自己写了一个仿造版本的array_column 两种思路 1.直接遍历 取值给追加数组 返回 2. ...
- Eclipse中SVN的安装步骤(两种)和使用方法[转载]
一.给Eclipse安装SVN,最常见的有两种方式:手动方式和使用安装向导方式.具体步骤如下: 方式一:手动安装 1.从官网下载site-1.6.9.zip文件,网址是:subclipse.tigri ...
- [Redux] Fetching Data on Route Change
We will learn how to fire up an async request when the route changes. A mock server data: /** /api/i ...