一. 举例

比如,现在中图和日本在关于钓鱼岛问题上存在争端。这时,联合国就会站出来,做为调解者,其实也没什么好调解的,钓鱼岛本来就是中国的,这是不争的事实!联合国也就是个传话者、发言人。

结构图如下:

代码如下:

  1. //抽象国家
  2. class Country
  3. {
  4. protected:
  5. Mediator *m_mediator; //中介
  6. public:
  7. virtual void SetMediator(Mediator *mediator){} //设置中介
  8. virtual void SendMessage(string message) {}    //向中介发信息
  9. virtual void GetMessage(string message) {}     //从中介获取信息
  10. };
  11. //抽象中介者
  12. class Mediator
  13. {
  14. public:
  15. virtual void Send(string message, Country *person) {}
  16. virtual void SetJanpa(Country *Janpa) {}  //让中介认识具体的对象
  17. virtual void SetChina(Country *China) {}
  18. };
  19. //日本
  20. class Janpa: public Country
  21. {
  22. public:
  23. void SetMediator(Mediator *mediator) { m_mediator = mediator; }
  24. void SendMessage(string message) { m_mediator->Send(message, this); }
  25. void GetMessage(string message) { cout<<"日本收到信息: "<<message; }
  26. };
  27. //中国
  28. class China: public Country
  29. {
  30. public:
  31. void SetMediator(Mediator *mediator) { m_mediator = mediator; }
  32. void SendMessage(string message) { m_mediator->Send(message, this); }
  33. void GetMessage(string message) { cout<<"中国收到信息: "<<message; }
  34. };
  35. //联合国
  36. class UN : public Mediator
  37. {
  38. private:
  39. Country *m_Janpa; //日本
  40. Country *m_China; //中国
  41. public:
  42. UN(): m_Janpa(NULL), m_China(NULL) {}
  43. void SetJanpa(Country *Janpa) { m_Janpa = Janpa; }
  44. void SetChina(Country *China) { m_China = China; }
  45. void Send(string message, Country *country)
  46. {
  47. if(country == m_Janpa) //日本给中图发信息
  48. m_China->GetMessage(message); //中国收到信息
  49. else
  50. m_Janpa->GetMessage(message);
  51. }
  52. };
  53. //测试代码
  54. int main()
  55. {
  56. Mediator *mediator = new UN();
  57. Country *pJanpa = new Janpa();    //日本
  58. Country *pChina = new China();  //中国
  59. mediator->SetJanpa(Janpa);
  60. mediator->SetChina(China);
  61. pJanpa->SetMediator(mediator);
  62. pChina->SetMediator(mediator);
  63. pJanpa->SendMessage("钓鱼岛是我们的,哈哈哈...\n");
  64. pChina->SendMessage("操,你他妈再乱放屁,小心我弄死你!\n");
  65. delete pJanpa;
  66. delete pChina;
  67. delete mediator;
  68. return 0;
  69. }

二. 中介者模式

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

说明:

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

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

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

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

设计模式C++描述----18.中介者(Mediator)模式的更多相关文章

  1. 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考

    http://www.cnblogs.com/insus/p/4142264.html 重构if...else...或者switch程序块 为 中介者(Mediator)模式.的思考 首先普世的编程架 ...

  2. 设计模式C++描述----12.享元(Flyweight)模式

    一. 概述 在面向对象系统的设计何实现中,创建对象是最为常见的操作. 这里面就有一个问题:如果一个应用程序使用了太多的对象,就会造成很大的存储开销.特别是对于大量轻量级(细粒度)的对象,比如在文档编辑 ...

  3. 设计模式C++描述----01.单例(Singleton)模式

    一.概念 单例模式:其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. class CSingleton { //公有的静态方法,来获取该实例 public: s ...

  4. 设计模式--中介(Mediator)模式

    时隔很长一段时,现在又重温设计模式,上个星期学习<设计模式--代理(Proxy)模式>http://www.cnblogs.com/insus/p/4128814.html. 温故而知新, ...

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

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

  6. C#设计模式之十八中介者模式(Mediator Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第五个模式,该模式是[中介者模式],英文名称是:Mediator Pattern.还是老套路,先从名字上来看看.“中介者模式”我第一次看到这个名称,我的理解 ...

  7. .NET设计模式(18):迭代器模式(Iterator Pattern)(转)

    概述 在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据. ...

  8. Mediator 中介者 协调者模式

    简介 定义:用一个[中介者对象]封装一系列的[对象交互],中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介者模式的结构 抽象中介者Mediator:定义好[ ...

  9. Mediator模式(仲裁者设计模式)

    Mediator ? Mediator的意思是"仲裁者""中介者".一方面,当发生麻烦事情的时候,通知仲裁者:当发生涉及全体组员的事情时,也通知仲裁者.当仲裁者 ...

随机推荐

  1. awk 命令使用

    awk命令就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.例如: awk -F '/' '{print $NF}' tmp/file.txt 该命令用于读取file. ...

  2. .net core 3.0 Signalr - 02 使用强类型的Hub

    ## 强类型的优缺点 - 优点 强类型的Hub可以避免魔法函数名,相比弱类型更容易维护和发现问题,直接上代码 - 缺点 特么的得多些好几行代码 ## 代码 ### 接口定义 ``` C# /// // ...

  3. 二次编码 深浅拷贝 is和==

    1.二次编码 ascii 不支持中文 gbk 支持中文 2个字节 包含ascii Unicode 万国码 python3 内存Unicode utf-8 可变的长度 英文 1字节 欧洲2个字节 亚洲3 ...

  4. 【原创】go语言学习(二)数据类型、变量量、常量量

    目录 1.标识符.关键字2. 变量量和常量量3. 数据类型4. Go程序基本结构 标识符.关键字 1.标识符是⽤用来表示Go中的变量量名或者函数名,以字⺟母或_开头.后⾯面跟着字⺟母 ._或数字2. ...

  5. Ubuntu18.04安装好MySQL5.7后,root账号登录密码问题

    不知道从哪个版本开始,在Ubuntu上用apt安装MySQL后,不会提示让你设置密码了. 安装MySQL5.7 sudo apt install mysql-server -y 然后找到MySQL的配 ...

  6. 从单片机到操作系统⑦——深入了解FreeRTOS的延时机制

    >没研究过操作系统的源码都不算学过操作系统 # FreeRTOS 时间管理 时间管理包括两个方面:系统节拍以及任务延时管理. ## 系统节拍: 在前面的文章也讲得很多,想要系统正常运行,那么时钟 ...

  7. Docker 配置国内镜像

    前言 当我们使用Docker pull 拉取镜像时,有时候因网络问题,导致获取镜像报错,如下 :Error response from daemon:Get https://registry-1.co ...

  8. redis之spring应用

    前言 读本文之前,需要大家对redis有所了解,大家可以去看一下我之前分享的redis安装及简单使用这一随笔,而本文我将跟大家分享学习一下redis与spring的集成.当然,首先需要打开我们的red ...

  9. 动态扩容lvm逻辑卷的操作记录

    在进行动态扩容LVM逻辑卷的之前,先看这篇文章:https://www.cnblogs.com/huhyoung/p/9689776.html.以下是我实操记录. 在上班期间,测试经理突然找我,能不能 ...

  10. C#输入中文实现转拼音首字母(亲测,字库不全)

    public string GetPYString(string str) { string tempStr = ""; foreach (char c in str) { if ...