文章目录

  • 前言
  • 一、中介者模式( Mediator 模式)
  • 二、具体源码
    • 1.Colleage.h
    • 2.Colleage.cpp
    • 3.Mediator.h
    • 4.Mediator.cpp
    • 5.main.cpp
  • 三、运行结果
  • 总结

前言

在系统的设计开发过程中,对象之间的交互和通信是最常见的,因为对象间的交互本身就是一种通信。当系统规模变大,对象的大量增加会引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式。Mediator 模式提供将对象间的交互和通讯封装在一个类中,使各对象不需要显式地相互引用,实现了耦合松散,而且可以独立地改变它们之间的交互。


一、中介者模式( Mediator 模式)

Mediator模式中,每个Colleague维护一个 Mediator,当要进行交互,例如图中ConcreteColleagueA 和 ConcreteColleagueB 之间的交互就可以通过 ConcreteMediator提供的DoActionFromAtoB 来处理,ConcreteColleagueA 和 ConcreteColleagueB 不必维护对各自的引用。当通信对象发生改变时,只需更改ConcreteMediator中的通信方式即可。Mediator 通过这种方式将多对多的通信简化为了一(Mediator)对多(Colleague)的通信。UML图如下:


二、具体源码

1.Colleage.h

代码如下(示例):

#ifndef _COLLEAGE_H_
#define _COLLEAGE_H_ #include <iostream>
#include <string> class Mediator;
class Colleage
{public:virtual ~Colleage();//纯虚函数,提供接口virtual void Aciton() = 0;virtual void SetState(const std::string& sdt) = 0;virtual std::string GetState() = 0;protected:Colleage();Colleage(Mediator* mdt);Mediator* _mdt;private:
};class ConcreteColleageA :public Colleage
{public:ConcreteColleageA();ConcreteColleageA(Mediator* mdt);~ConcreteColleageA();void Aciton();void SetState(const std::string& sdt);std::string GetState();protected:
private:std::string _sdt;
};class ConcreteColleageB :public Colleage
{public:ConcreteColleageB();ConcreteColleageB(Mediator* mdt);~ConcreteColleageB();void Aciton();void SetState(const std::string& sdt);std::string GetState();protected:
private:std::string _sdt;
};#endif //_COLLEAGE_H_

2.Colleage.cpp

代码如下(示例):

#include "Mediator.h"
#include "Colleage.h"Colleage::Colleage()
{this->_mdt=nullptr;
}Colleage::Colleage(Mediator* mdt)
{this->_mdt = mdt;
}Colleage::~Colleage()
{}
ConcreteColleageA::ConcreteColleageA()
{this->_sdt = " ";
}ConcreteColleageA::~ConcreteColleageA()
{}ConcreteColleageA::ConcreteColleageA(Mediator*mdt) :Colleage(mdt)
{this->_sdt = " ";
}std::string ConcreteColleageA::GetState()
{return _sdt;
}void ConcreteColleageA::SetState(const std::string& sdt)
{_sdt = sdt;
}void ConcreteColleageA::Aciton()
{_mdt->DoActionFromAtoB();//std::cout << "State of ConcreteColleageA:" << "   "<<this->GetState()<<std::endl;
}ConcreteColleageB::ConcreteColleageB()
{this->_sdt = " ";
}ConcreteColleageB::~ConcreteColleageB()
{}ConcreteColleageB::ConcreteColleageB(Mediator* mdt) :Colleage(mdt)
{this->_sdt = " ";
}
void ConcreteColleageB::Aciton()
{_mdt->DoActionFromBtoA();//std::cout << "State of ConcreteColleageB:" << "   "<<this->GetState()<<std::endl;
}
std::string ConcreteColleageB::GetState()
{return _sdt;
}
void ConcreteColleageB::SetState(const std::string& sdt)
{_sdt = sdt;
}

3.Mediator.h

代码如下(示例):

#pragma once#ifndef _MEDIATOR_H_
#define _MEDIATOR_H_ #include"Colleage.h"class Mediator
{public:virtual ~Mediator();virtual void DoActionFromAtoB() = 0;virtual void DoActionFromBtoA() = 0;protected:Mediator();private:
};class ConcreteMediator :public Mediator
{public:ConcreteMediator();ConcreteMediator(Colleage* clgA, Colleage* clgB);~ConcreteMediator();void SetConcreteColleageA(Colleage* clgA);void SetConcreteColleageB(Colleage* clgB);Colleage* GetConcreteColleageA();Colleage* GetConcreteColleageB();void IntroColleage(Colleage* clgA, Colleage* clgB);void DoActionFromAtoB();void DoActionFromBtoA();protected:
private:Colleage* _clgA;Colleage* _clgB;
};
#endif //_MEDIATOR_H_

4.Mediator.cpp

代码如下(示例):

#include "Mediator.h" Mediator::Mediator()
{}Mediator::~Mediator()
{}ConcreteMediator::ConcreteMediator()
{}ConcreteMediator::~ConcreteMediator()
{}ConcreteMediator::ConcreteMediator(Colleage* clgA, Colleage* clgB)
{this->_clgA = clgA;this->_clgB = clgB;
}void ConcreteMediator::SetConcreteColleageA(Colleage* clgA)
{this->_clgA = clgA;
}void ConcreteMediator::SetConcreteColleageB(Colleage* clgB)
{this->_clgB = clgB;
}Colleage* ConcreteMediator::GetConcreteColleageA()
{return _clgA;
}Colleage* ConcreteMediator::GetConcreteColleageB()
{return _clgB;
}void ConcreteMediator::IntroColleage(Colleage* clgA, Colleage* clgB)
{this->_clgA = clgA;this->_clgB = clgB;
}void ConcreteMediator::DoActionFromAtoB()
{_clgB->SetState(_clgA->GetState());
}void ConcreteMediator::DoActionFromBtoA()
{_clgA->SetState(_clgB->GetState());
}

5.main.cpp

代码如下(示例):

#include "Mediator.h"
#include "Colleage.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{//初始化ConcreteMediator* m = new ConcreteMediator();ConcreteColleageA* c1 = new ConcreteColleageA(m);ConcreteColleageB* c2 = new ConcreteColleageB(m);m->IntroColleage(c1, c2);c1->SetState("old");c2->SetState("old");std::cout << "State of ConcreteColleageA:" << "   " << c1->GetState() << std::endl;//将A的状态拷贝给Bc1->Aciton();std::cout << "State of ConcreteColleageB:" << "   " << c2->GetState() << std::endl;cout << endl;c1->SetState("new");std::cout << "State of ConcreteColleageA:" << "   "<< c1->GetState() << std::endl;//调用中介者,将A的状态拷贝给Bc1->Aciton();std::cout << "State of ConcreteColleageB:" << "   "<< c2->GetState() << std::endl;cout << endl;c2->SetState("old");std::cout << "State of ConcreteColleageB:" << "   " << c2->GetState() << std::endl;//调用中介者,将B状态拷贝给Ac2->Aciton();std::cout << "State of ConcreteColleageA:" << "   " << c1->GetState() << std::endl;return 0;
}

程序主体流程
1)将 ConcreteColleageA 对象设置状态“old”,ConcreteColleageB 也设置状态“old”,输出状态;
2)ConcreteColleageA 状态设置为“new",通过Action调用中介者_mdt与ConcreteColleageB 对象进行通信,并改变ConcreteColleageB 对象的状态为“new”,输出两者状态;
3)ConcreteColleageB 状态设置为“old",通过Action调用中介者_mdt与ConcreteColleageA 对象进行通信,并改变ConcreteColleageA 对象的状态为“old”,输出两者状态;
注意:两个 Colleague 对象并不知道它交互的对象,并且也不是显示地处理交互过程,这一切都是通过 Mediator 对象完成的。


三、运行结果

Mediator 模式运行结果如下:


总结

从上述内容可以看出,Mediator 模式是一种很有用并且很常用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。Mediator 还获得系统解耦的特性,通过Mediator,各个Colleague就不必维护各自通信的对象和通信协议,降低了系统的耦合性,Mediator和各个Colleague就可以相互独立地修改了。
Mediator模式还有一个很显著额特点就是将控制集中,集中的优点就是便于管理,也正式符合了 面向对象程序设计中的每个类的职责要单一和集中的原则。但是当需要管理的对象过多时,中介者内部结构会庞大臃肿,变得复杂难以维护。


本文参考《设计模式精解-GoF 23 种设计模式解析附 C++实现源码》,对内容进行整理,方便大家学习。如想学习详细内容,请参考此书。

设计模式【18】——中介者模式( Mediator 模式)相关推荐

  1. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  2. 19 C++设计模式之中介者(Mediator)模式

    文章目录 中介者(Mediator)模式定义 中介者(Mediator)模式优缺点 优点 缺点 中介者(Mediator)模式构成与实现 构成 实例 中介者(Mediator)模式定义 中介者模式(M ...

  3. 14.设计模式--中介者模式(Mediator模式)

    1.定义 中介者模式是一种行为型模式,是为了解决对象之间错综复杂的调用关系的一种设计模式,这种错综复杂的调用关系采用一个中介类来进行帮忙调用,所有的调用者只是需要关心中介者,而不需要进行互相依赖. 例 ...

  4. c++中介者模式mediator

    中介者模式mediatorr 概念 角色和职责 模式优点 案例 概念 Mediator模式也叫中介者模式,是由GoF提出的23种软件设计模式的一种.Mediator模式是行为模式之一,在Mediato ...

  5. Mediator模式

    Mediator模式 Mediator模式是一种很有用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性. 面向对象设计激励将行为分布到各个对象中,但这种 ...

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

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

  7. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

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

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

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

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 英国脱欧但网络安全领域重视未减
  2. Go runtime的调度器
  3. Python 技巧篇-让我的程序暂停一下
  4. ini_set(display_errors,On);和error_reporting(E_ALL);
  5. 吴恩达深度学习笔记 2.6~2.9 logistic中的梯度下降
  6. linux服务器知识学习:linux简介与linux的发行版
  7. linux关闭在线登录用户和禁止root/IP直接ssh登录linux
  8. 类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z...
  9. vb 计算机cot,VB编程中运算sin、cos、tan、cot的程序怎么写?
  10. python Django中文文档
  11. HttpClient和RestTemplate
  12. tolua集成lua-protobuf库
  13. JSP Commons-FileUpload 组件实现文件上传
  14. 【51单片机】74HC595串转并 使用
  15. 现在俏皮话越来越多了
  16. 709元我上了斐讯K2P的车
  17. 等级保护测评经验分享干货
  18. 模,原码,补码,反码
  19. 全球与中国聚 (3,4-亚乙基二氧噻吩) (PEDOT)市场深度研究分析报告
  20. [数据结构]线性表——顺序存储

热门文章

  1. AI_Papers周刊:第六期
  2. 如何回答面试官项目亮点?
  3. tcpdump抓包分析详解
  4. 手机五款黑科技式APP 不用不知道
  5. 使用tls生成腾讯云的密钥
  6. 数论 - 分解质因数+欧拉函数 - Relatives POJ - 2407
  7. refind找不到linux,配置refind config以去除不必要的选项
  8. C 库函数 - strftime()
  9. 我与电脑的相识,相知,相爱
  10. Windows 杀死80端口进程