Mediator中介者模式
作用:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

UML如下:

Colleage抽象同事类,而ConcreteColleage是具体同时类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者对象,Mediator是抽象中介者,定义了同事对象到中介者对象的接口,ConcreteMediator是具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接受消息,向具体同事对象发出命令。

Colleage类,抽象同事类

Mediator,抽象中介者类

说明:

1. Mediator 模式中,每个Colleague 维护一个 Mediator,当要进行通信时,每个具体的 Colleague 直接向ConcreteMediator 发信息,至于信息发到哪里,则由 ConcreteMediator 来决定。

2. ConcreteColleagueA 和 ConcreteColleagueB 不必维护对各自的引用,甚至它们也不知道各个的存在。

3. 优点是,各个 Colleague 减少了耦合。

4. 缺点是,由于 Mediator 控制了集中化,于是就把 Colleague 之间的交互复杂性变为了中介者的复杂性,也就是中介者会变的比任何一个 Colleague 都复杂。

中介者模式很容易在系统中应用,也很容易在系统中误用。当系统中出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

Mediator的出现减少了各个Colleage的耦合,使得可以独立地改变和复用各个Colleage类和Mediator;
由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这使得中介者会变得比任何一个ConcreteColleage都复杂。

中介者模式的优点来自集中控制,其缺点也是它。

中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合。

代码如下:

Mediator.h

 #ifndef _MEDIATOR_H_
#define _MEDIATOR_H_ #include <string> using namespace std; class Mediator; class Colleage
{
public:
virtual ~Colleage();
virtual void SetMediator(Mediator*);
virtual void SendMsg(string) = ;
virtual void GetMsg(string) = ;
protected:
Colleage(Mediator*);
Mediator* _mediator;
private: }; class ConcreteColleageA : public Colleage
{
public:
~ConcreteColleageA();
ConcreteColleageA(Mediator*);
virtual void SendMsg(string msg);
virtual void GetMsg(string);
protected:
private:
}; class ConcreteColleageB : public Colleage
{
public:
~ConcreteColleageB();
ConcreteColleageB(Mediator*);
virtual void SendMsg(string msg);
virtual void GetMsg(string);
protected:
private:
}; class Mediator
{
public:
virtual ~Mediator();
virtual void SendMsg(string,Colleage*) = ;
protected:
Mediator();
private:
}; class ConcreteMediator : public Mediator
{
public:
ConcreteMediator();
~ConcreteMediator();
void SetColleageA(Colleage*);
void SetColleageB(Colleage*);
virtual void SendMsg(string msg,Colleage*);
protected:
private:
Colleage* m_ColleageA;
Colleage* m_ColleageB;
};
#endif

Mediator.cpp

 #include "Mediator.h"
#include <iostream>
#include <string> using namespace std; Colleage::Colleage(Mediator* pMediator)
{
this->_mediator = pMediator;
} Colleage::~Colleage()
{} void Colleage::SetMediator(Mediator* pMediator)
{
this->_mediator = pMediator;
} ConcreteColleageA::ConcreteColleageA(Mediator* pMediator) : Colleage(pMediator)
{
} ConcreteColleageA::~ConcreteColleageA()
{
} void ConcreteColleageA::SendMsg(string msg)
{
this->_mediator->SendMsg(msg,this);
} void ConcreteColleageA::GetMsg(string msg)
{
cout << "ConcreteColleageA Receive:"<< msg << endl;
} ConcreteColleageB::ConcreteColleageB(Mediator* pMediator) : Colleage(pMediator)
{
} ConcreteColleageB::~ConcreteColleageB()
{
} void ConcreteColleageB::SendMsg(string msg)
{
this->_mediator->SendMsg(msg,this);
} void ConcreteColleageB::GetMsg(string msg)
{
cout << "ConcreteColleageB Receive:" << msg << endl;
} Mediator::Mediator()
{} Mediator::~Mediator()
{} ConcreteMediator::ConcreteMediator()
{} ConcreteMediator::~ConcreteMediator()
{} void ConcreteMediator::SetColleageA(Colleage* p)
{
this->m_ColleageA = p;
} void ConcreteMediator::SetColleageB(Colleage* p)
{
this->m_ColleageB = p;
} void ConcreteMediator::SendMsg(string msg,Colleage* p)
{
if(p == this->m_ColleageA)
{
this->m_ColleageB->GetMsg(msg);
}
else if(p == this->m_ColleageB)
{
this->m_ColleageA->GetMsg(msg);
}
}

main.cpp

 #include "Mediator.h"

 int main()
{
ConcreteMediator* pMediator = new ConcreteMediator(); Colleage* p1 = new ConcreteColleageA(pMediator);
Colleage* p2 = new ConcreteColleageB(pMediator); pMediator->SetColleageA(p1);
pMediator->SetColleageB(p2); p1->SendMsg("xxx");
p2->SendMsg("ooo");
return ;
}

结果如下:

C++设计模式-Mediator中介者模式的更多相关文章

  1. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...

  2. 设计模式16:Mediator 中介者模式(行为型模式)

    Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...

  3. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 折腾Java设计模式之中介者模式

    博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...

  5. java设计模式之中介者模式

    中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...

  6. js设计模式——8.中介者模式

    js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...

  7. [设计模式] 17 中介者模式 Mediator Pattern

    在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...

  8. 设计模式之中介者模式(Mediator )

    中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...

  9. C#设计模式:中介者模式(Mediator Pattern)

    一,什么是中介者模式(Mediator Pattern)? 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.比如:如果我们实现两个人的交互,难道我们要定义两个对象 ...

随机推荐

  1. jquery的dom操作

    DOM操作 $("p").appendTo("div");把p标签追加到div标签--中--后 $("p").prependTo(" ...

  2. Java笔记10-Object包装类型字符串

    提纲: 1.java.lang.0bject中常用方法介绍 2.基本类型对应的包装类型的介绍 以及基本类型和包装类型之间的相互转换 3.java.lang.String 字符串处理类 java.lan ...

  3. js 获取小数点位数方法及 字符串与数字之间相互转换方法

    1.获取小数点位数方法 a. 使用 js 中 subsrting,indexOf,parseFloat三个函数,代码如下: var s = "22.127456" ;//s 为 字 ...

  4. codeforces A. Difference Row

    link:http://codeforces.com/contest/347/problem/A 开始看起来很复杂的样子,但是刚写下样例,就发现因为中间的都消去了,其实起作用的就是最大值和最小值=_= ...

  5. 运动规划 (Motion Planning): MoveIt! 与 OMPL

    原创博文:转载请标明出处:http://www.cnblogs.com/zxouxuewei 最近有不少人询问有关MoveIt!与OMPL相关的话题,但是大部分问题都集中于XXX功能怎么实现,XXX错 ...

  6. RMQ算法模板

    分别写了下标从0和1开始的两种 #include<stdio.h> #include<string.h> #include<algorithm> #include& ...

  7. jd-gui报错INTERNAL ERROR 解决办法

    问题:我用dex2jar工具反编译了apk文件,但当我用jd-gui反编译前面操作获得的jar文件的时,能很完美地看到大部分类反编译后的代码,但有一部分类不能显示出来--constants类,仅仅显示 ...

  8. Digital root(数根)

    关于digital root可以参考维基百科,这里给出基本定义和性质. 一.定义 数字根(Digital Root)就是把一个数的各位数字相加,再将所得数的各位数字相加,直到所得数为一位数字为止.而这 ...

  9. jmeter录制移动APP脚本

    一.准备环境 准备好jmeter运行环境 在电脑端安装无线Wifi插件,保证手机与电脑处于同一个局域网中 如果本机JDK版本为1.6,则升级JDK版本至1.7,否则,在HTTPS Domains中无法 ...

  10. 本地搭建ubuntu

    1 使用VMware Workstation 安装ubuntu 14 2 进入ubuntu 命令行 ctrl+alt+f2 3 默认root用户是无固定密码的,并且是被锁定的,如果想给root设置一个 ...