1 模式介绍

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

面向对象设计鼓励将行为分布到各个对象中。但是,这种分布可能会导致对象间有许多连接。每一个对象都知道其他所有对象,就造成了复杂的关系。对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

2 模式结构

(1)抽象中介者(Mediator)

抽象中介者用于定义一个接口,接口用于各同事之间的通信。

(2)具体中介者(ConcreteMediator)

具体中介者是抽象中介者的子类,通过协调各个同事对象来实现协作行为,了解并维护它对各个同事对象的引用。

(3)抽象同事类(Colleague)

抽象同事类定义各同事的公有方法。

(4)具体同事类(ConcreteColleague)

具体同事类是抽象同事类的子类,每一个同事对象都引用一个中介者对象;

每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;

3 模式优缺点

3.1 优点

(1)简化了对象之间的交互。用中介者和同事的一对多的关系代替了原来同事之间的多对交互。

(2)将各同事解耦。中介者有利于各同事之间的松耦合。

(3)减少子类生成。

3.2 缺点

在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使能系统难以维护。

4 模式应用

(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱难以理解。

(2)一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

5 模式实现

利用中介者模式实现聊天是功能。

#include <iostream>
using namespace std;#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
//抽象中介者
class Mediator;
//抽象同事类
class Colleague
{
public:Colleague(Mediator *pMediator) : m_pMediator(pMediator){}virtual void Send(char *message) = 0;protected:Mediator *m_pMediator;
};//具体同事类1
class ConcreteColleague1 : public Colleague
{
public:ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator){}void Send(char *message);void Notify(char *message){wcout<<message<<endl;}
};
//具体同事类2
class ConcreteColleague2 : public Colleague
{
public:ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator){}void Send(char *message);void Notify(char *message){cout<<"ConcreteColleague2 is handling the message."<<endl;wcout<<message<<endl;}
};//抽象中介者类
class Mediator
{
public:virtual void Sent(char *message, Colleague *pColleague) = 0;
};//具体中介者类
class ConcreteMediator : public Mediator
{
public:// The mediator forward the messagevoid Sent(char *message, Colleague *pColleague){ConcreteColleague1 *pConcreteColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);if (pConcreteColleague1){cout<<"The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2"<<endl;if (m_pColleague2){m_pColleague2->Notify(message);}}else{if (m_pColleague1){m_pColleague1->Notify(message);}}}void SetColleague1(Colleague *pColleague){m_pColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);}void SetColleague2(Colleague *pColleague){m_pColleague2 = dynamic_cast<ConcreteColleague2 *>(pColleague);}private:// The Mediator knows all the ColleagueConcreteColleague1 *m_pColleague1;ConcreteColleague2 *m_pColleague2;
};void ConcreteColleague1::Send(char *message)
{// The second parameter mark where the message comes fromm_pMediator->Sent(message, this);
}void ConcreteColleague2::Send(char *message)
{m_pMediator->Sent(message, this);
}int main()
{// Create the mediatorMediator *pMediator = new ConcreteMediator();Colleague *pColleague1 = new ConcreteColleague1(pMediator);Colleague *pColleague2 = new ConcreteColleague2(pMediator);ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);pConcreteMediator->SetColleague1(pColleague1);pConcreteMediator->SetColleague2(pColleague2);char message[260] = "Where are you from?";pColleague1->Send(message);return 0;
}

输出信息:

The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2
ConcreteColleague2 is handling the message.
Where are you from?

6 中介者与外观者模式的区别

外观模式与中介者模式的不同之处在于,外观模式是对一个对象子系统进行抽象,从而提供了一个更为方便的接口;外观模式的协议是单向的,即外观模式向子系统提出请求,但反过来则不行;而对于中介者模式,是进行多个对象之间的协作,通信是多向的

参考文献:

【1】C++设计模式——中介者模式 - Ring_1992 - 博客园

【2】中介者模式 | 菜鸟教程

C++行为型模式-中介者模式相关推荐

  1. 设计模式-行为型模式-中介者模式

    设计模式-行为型模式-中介者模式 行为型模式 划分类和对象的职责. 中介者模式 进销存管理,即采购,销售,库存. 其中类图 代码如下 public class Purchase {// 采购IBM电脑 ...

  2. Java设计模式之行为型:中介者模式

     前言: 在我们的生活中处处充斥着"中介者",比如你租房.买房.找工作.旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌 ...

  3. 第十九章行为型模式—中介者模式

    文章目录 中介者模式 解决的问题 结构 实例 存在的问题 适用场景 中介者模式和代理模式的区别 代理模式 中介模式 桥接模式 总结 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间 ...

  4. 设计模式 — 行为型模式 — 中介者模式

    目录 文章目录 目录 中介者模式 应用场景 代码示例 中介者模式 中介者模式,将其他对象之间的交互装在中介者对象中,达到松耦合.隐式引用.独立变化. 中介者模式与代理模式有相似之处.但是代理模式是结构 ...

  5. 《设计模式详解》行为型模式 - 中介者模式

    中介者模式 6.7 中介者模式 6.7.1 概述 6.7.2 结构 6.7.3 案例实现 6.7.4 优缺点 6.7.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 6 ...

  6. php中介模式,中介者模式(Mediator pattern)详解及PHP实现

    中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可 ...

  7. 安卓适配器类中怎么调用intent_设计模式:代理模式/中介者模式 / 桥接模式/适配器 - 七星望...

    模式某种角度上来讲就是对象组合.不要看他们都是对象组合就好像是一样的.模式的动机,意图,使用场合,组合方式,这些都是模式的一部分.其中细微的不同足以区分不同的模式. 行为模式的主要特点就是处理的是对象 ...

  8. 【设计模式】外观模式代理模式中介者模式的区别

    外观模式 个人理解: 子类继承外观类的所有属性方法,客户端只需要跟外观类进行交流,实现了对所有子类的封装. 没有使用外观类 如图: 应用外观类 如图: 代理模式 个人理解: 代理模式是将原类进行封装, ...

  9. Java23种设计模式——19.行为型模式之中介者模式

    Java中除去有设计原则之外,还有23中设计模式. 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题. 并且在这些模式中,可以说是将语言的使用体现的淋 ...

  10. 行为型设计模式之中介者模式

    中介者模式 中介者模式 应用场景 主要角色 优缺点 基本使用 创建抽象中介者 创建具体中介者 创建抽象同事类 创建具体同事类 客户端执行 中介者模式 中介者模式又称为调解者模式或调停者模式,属于行为型 ...

最新文章

  1. 最流行的解压缩软件--winrar
  2. 【十大经典数据挖掘算法】EM
  3. 顺序存储结构和链式存储结构的优缺点
  4. python识别文字tesseract
  5. ARM处理器的9种模式详解
  6. 基于SSM的小区报修系统
  7. Atiti 高并发程序设计 艾提拉著 目录 1. 第—部分 基础知识 2 1.1.  第1章 并行计算机的硬件基础   1.1 并行计算机的组成   1.2 共享存储器多处理器系统   1.3 消
  8. mfc控件设置颜色(超全)
  9. 一个外国程序员中的中国程序员
  10. C语言:fflush()的用法以及缓冲区的概念
  11. 使用Hypothesis生成测试数据
  12. 15高级链接构建策略和技巧,以提高您的SEO
  13. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
  14. 【CSS 教程系列第 12 篇】什么是 CSS 中的伪类选择器
  15. 戴尔r510服务器加硬盘没反应,戴尔R510_R410_R610_R710等所有服务器安装win2003解决办法...
  16. 面试时如何优雅地自我介绍? 1
  17. 02 AE脚本开发使用什么编辑器
  18. PHP开发者的 PHP源代码 --之一 结构
  19. OSI模型的传输层,会话层,表示层,
  20. C语言复习:(四)函数指针

热门文章

  1. 什么是PHP,PHP能干什么,为什么使用PHP
  2. 小米蓝牙广播数据解析(MiBeacon)
  3. 破局:技术视野与规划
  4. Beyond Compare出现“许可证密钥已被撤销”提示的解决办法(非一劳永逸)
  5. IE清除默认的三角形
  6. 颜色匹配 Matlab版本
  7. Pytorch grid_sample解析
  8. android 发送UDP广播,搜寻服务器建立socket链接
  9. 关于CREO图纸导出到CAD后尺寸不对的问题
  10. Swift,任重而道远!