C++设计模式-Mediator中介者模式
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中介者模式的更多相关文章
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 设计模式16:Mediator 中介者模式(行为型模式)
Mediator 中介者模式(行为型模式) 依赖关系的转化 动机(Motivation) 在软件构建过程中,经常出现多个对象互相关联交互的情况,对象之间经常会维持一种复杂的应用关系,如果遇到一些需求的 ...
- 设计模式之中介者模式(Mediator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程.它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 折腾Java设计模式之中介者模式
博文原址:折腾Java设计模式之中介者模式 中介者模式 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并 ...
- java设计模式之中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...
- js设计模式——8.中介者模式
js设计模式——8.中介者模式 /*js设计模式——中介者模式*/ class A { constructor() { this.number = 0; } setNumber(num, m) { t ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 设计模式之中介者模式(Mediator )
中介者模式是关于数据交互的设计模式,该模式的核心是一个中介者对象,负责协调一系列对象之间的不同的数据请求,这一系列对象成为同事类.如房产中介(简直不想提它),买房的卖房的,租房的放租的都到房产中介那里 ...
- C#设计模式:中介者模式(Mediator Pattern)
一,什么是中介者模式(Mediator Pattern)? 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.比如:如果我们实现两个人的交互,难道我们要定义两个对象 ...
随机推荐
- flex4
今天发现了一个问题:昨天把序列号输入之后可以用了,但是再次打开软件之后还是要求输序列号的.遇到这种情况的朋友可以这样操作.打开C:\WINDOWS\system32\drivers\etc这个目录,修 ...
- VS大视野
vs的本质:他是微软公司的员工一起开发的一个项目: 既然是项目:那么就是用编程语言编出来的! 用的是C# C#有他的特点:继承,封装,多态!等 我们在使用vs的时候,为什么可以使用很多的里面已经存在的 ...
- java封装性之private
public class TestDemo{ public static void main(String args[]){ Person perA= new Person(); perA.setNa ...
- php获取post参数的几种方式 RPC 规定接收取值方式 $GLOBALS['HTTP_RAW_POST_DATA'];
http://www.cnblogs.com/zhepama/p/4022606.html PHP默认识别的数据类型是application/x-www.form-urlencoded标准的数据类型. ...
- SQL Server 中存储过程的练习
建库建表建约束 插入数据 --建库建表建约束和插入测试数据 use bankDB go --1.完成存款,取款业务--存款 create proc usp_takeMoney ),),)=null,@ ...
- 洛谷 P3384 树链剖分(模板题)
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...
- USACO 2015 December Contest, Gold Problem 2. Fruit Feast
Problem 2. Fruit Feast 很简单的智商题(因为碰巧脑出来了所以简单一,一 原题: Bessie has broken into Farmer John's house again! ...
- winform中固定界面大小的方法
Step1: MaximizeBox : False MinimizeBox : False Step2: FormBoarderStyle : FixedSingle
- oracle 职业学习指引
风哥 它是阿里巴巴造出的概念.其本意是,在阿里巴巴的IT架构中,去掉IBM的小型机.Oracle数据库.EMC存储设备,代之以自己在开源软件基础上开发的系统. 思科.IBM.谷歌.高通.英特尔.苹果. ...
- spring && Cobertura && maven &&junit 单元测试以及测试覆盖率
1. 目的: junit 单元测试,Cobertura 测试覆盖率报告 项目目录结构 2. maven 配置 <project xmlns= ...