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

  类图:

  适用性:

  • 一组对象以定义良好但是复杂的方式进行通信。因为这组类之间的相互关系错综复杂,如果直接管理会十分困难,因此利用中介者管理它们的关系,而Client只需要知道中介者的接口即可。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

  优缺:

  • 减少了子类的生成。
  • 它将各Colleague解耦。
  • 它简化了对象协议。由多对多变成一对多。
  • 它对对象如何写作进行了抽象。将注意力从对象各自本身的行为转移到它们之间的交互上来。
  • 它使控制集中化。将对象间交互的复杂性变为中介者的复杂性,可能使得中介者自身成为一个难于维护的庞然大物。

  模板代码:

#include <iostream>
#include <string>
using namespace std;

class Colleague;

class Mediator {
public:
    ;
};

class Colleague {
public:
    Colleague(Mediator *pMediator) { m_pMediator = pMediator; }
    void notify(string message) { cout << "Got message : " << message << endl; }
protected:
    Mediator *m_pMediator;
};

class ConcreteColleague1 : public Colleague {
public:
    ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator) {}
    void send(string message) { m_pMediator->send(message, this); }
    void notify(string message) { cout << "Colleague1 got message : " << message << endl; }
};

class ConcreteColleague2 : public Colleague {
public:
    ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator) {}
    void send(string message) { m_pMediator->send(message, this); }
    void notify(string message) { cout << "Colleague2 got message : " << message << endl; }
};

class ConcreteMediator : public Mediator {
public:
    void setColleague1(ConcreteColleague1 *pColleague1) {
        m_pColleague1 = pColleague1;
    }
    void setColleague2(ConcreteColleague2 *pColleague2) {
        m_pColleague2 = pColleague2;
    }
    void send(string message, Colleague *pColleague) {
        if(pColleague == m_pColleague1) {
            m_pColleague2->notify(message);
        }
        else {
            m_pColleague1->notify(message);
        }
    }

private:
    ConcreteColleague1 *m_pColleague1;
    ConcreteColleague2 *m_pColleague2;
};

int main() {
    ConcreteMediator *pcm = new ConcreteMediator();;
    ConcreteColleague1 *pc1 = new ConcreteColleague1(pcm);
    ConcreteColleague2 *pc2 = new ConcreteColleague2(pcm);

    pcm->setColleague1(pc1);
    pcm->setColleague2(pc2);

    pc1->send("message from pc1");

  delete pcm;  delete pc1;  delete pc2;
    ;
}

  中介者模式就是封装了多个类之间的交互,使得我们不需要直接在多个类之间手动弄交互。

  如下所示:

  但是这样就使得中介者变得复杂了,需要小心管理。

中介者模式(Mediator)的更多相关文章

  1. 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...

  2. 二十四种设计模式:中介者模式(Mediator Pattern)

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

  3. 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...

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

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

  5. 中介者模式(Mediator Pattern)

    用于减少多个对象或类之间的通信复杂性. 此模式提供了一个中介类,它通常处理不同类之间的所有通信,并支持通过松散耦合来维护代码.中介者模式属于行为模式类别. 实现实例 在这里通过一个聊天室的示例来演示中 ...

  6. 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

  7. 18.中介者模式(Mediator Pattern)

    using System; namespace Test { class Program { /// <summary> /// 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关 ...

  8. 大熊君说说JS与设计模式之------中介者模式Mediator

    一,总体概要 1,笔者浅谈 我们从日常的生活中打个简单的比方,我们去房屋中介租房,房屋中介人在租房者和房东出租者之间形成一条中介.租房者并不关心他租谁的房.房东出租者也不关心他租给谁.因为有中介的存在 ...

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

    场景分析: 众所周知,电脑有很多组成部分,如硬盘.内存.光驱.音频.键盘等,各个组件之间协同工作才能保证电脑的正常运行. 如果各个组件之间直接交互,可能会比较复杂,如下图: 将上面的各个组件抽象成类, ...

随机推荐

  1. AngularJS学习之模块

    1.模块定义了一个应用程序:模块是应用程序中不同部分的容器:模块是应用控制器的容器:控制器通常属于一个模块 2.创建模块:你可以通过AngularJS的angular.module函数来创建模块: & ...

  2. Matlab 查看变量信息who whos命令

  3. iOS10 UI教程视图的几何形状

    iOS10 UI教程视图的几何形状 视图属性中的一部分属性可以让定义的视图绘制在屏幕上.在讲解这些属性前,我们首先将讲解,定义视图的几何形状所涉及到的结构类型.这些结构类型如下: CGPoint:它表 ...

  4. 分享Kali Linux 2016.2第47周镜像

    分享Kali Linux 2016.2第47周镜像Kali Linux官方于11月20日发布Kali Linux 2016.2的第47周镜像.这次发布仍然包含11个镜像文件.其中,不仅包含Gnome桌 ...

  5. css3 -- 渐变

    1.Firefox中的线性渐变 E{ background-image:-moz-linear-gradient(point or angle , form-stop, color-stop, to- ...

  6. TestNg线程池配置、执行次数配置、超时配置

    使用注解的方式对TestNg线程池配置.执行次数配置.超时配置 注:使用注解来控制测试方法运行的次数和超时时间,timeOut在单线程或者多线程模式下都可用,threadPoolSize设置了线程池的 ...

  7. DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects

    题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...

  8. TFS安装与管理

    整了几天TFS,把相关的一些配置与安装的要点简单记下,希望对大家有用.本篇主要是安装与配置上的内容,下一篇会介绍如何使用以及使用方面的相关心得体会. 本篇内容简要: 1.   安装部署 1.1.  流 ...

  9. iOS开发代码规范(通用)

    1. 关于命名 1> 统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释 使用全称,不适用缩写 2> 类的命名 大驼峰式命名:每个单词的首字母都采用大写字母 例子:M ...

  10. Storm实战:在云上搭建大规模实时数据流处理系统(Storm+Kafka)

    在大数据时代,数据规模变得越来越大.由于数据的增长速度和非结构化的特性,常用的软硬件工具已无法在用户可容忍的时间内对数据进行采集.管理和处理.本文主要介绍如何在阿里云上使用Kafka和Storm搭建大 ...