一. 举例

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

结构图如下:

代码如下:

  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. Two progressions CodeForce 125D 思维题

    An arithmetic progression is such a non-empty sequence of numbers where the difference between any t ...

  2. 关于.NET HttpClient方式获取微信小程序码(二维码)

    随着微信小程序的火热应用,市面上有关小程序开发的需求也多了起来.近来分析了一项生成有关生成微信小程序码的需求——要求扫码跳转到小程序指定页面(带参数):看了下小程序官方文档文档,结合网上的例子,未看到 ...

  3. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3+Nacos1.1.3(最新版)

    1.概述 本文将介绍如何基于Spring Boot 2.x的版本,通过Nacos作为配置与注册中心,实现Dubbo服务的注册与消费. 整合组件的版本说明: Spring Boot 2.1.9 Dubb ...

  4. 自动下载zar配置管理

    maven 下载: https://maven.apache.org/ 官网 download 下载:Binary zip archive apache-maven-3.6.2-bin.zip 免安装 ...

  5. python语言程序设计基础(嵩天)第三章课后习题部分个人练习

    p69: *题3.5: 源代码: (1)print(30-3**2+8//3**2*10)     答案:21 (2)print(3*4**2/8%5)     答案:1.0 (3)print(2** ...

  6. spring Bean的三种配置方式

    Spring Bean有三种配置方式: 传统的XML配置方式 基于注解的配置 基于类的Java Config 添加spring的maven repository <dependency> ...

  7. 算法学习之剑指offer(二)

    题目1 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. import java.util.Stack; public class Solution { ...

  8. 最简单的ArcGIS Engine应用程序(下)

    在中篇我们讲到使用OpenFileDialog控件可以添加shp文件.(最简单的ArcGIS Engine应用程序(中)) 添加lyr文件的操作也是大同小异的. using System; using ...

  9. Unreal Engine 4 系列教程 Part 3:材质教程

    .katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...

  10. Ubuntu分区方案

    swap: 4G(跟你自己内存一样大):主分区:空间起始位置:用于交换空间 /boot: 300M(太小会导致软件无法升级):逻辑分区:空间起始位置:EXT4:/boot /: 30G:主分区:空间起 ...