一. 举例

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

结构图如下:

代码如下:

  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. 从SpringMVC获取用户信息谈起

    Github地址:https://github.com/andyslin/spring-ext 编译.运行环境:JDK 8 + Maven 3 + IDEA + Lombok spring-boot: ...

  2. Asteroids POJ - 3041 二分图最小点覆盖

       Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...

  3. .NetCore技术研究-.NET Core迁移前的准备工作

    前段时间迁移.NET Core做了大量的试水和评估,今天整理一下分享给大家.大致有以下几个部分: 1. .NET Core的由来 2. 为什么要迁移.NET Core 3. .NET Core3.X主 ...

  4. 【爬虫小程序:爬取斗鱼所有房间信息】Xpath(线程池版)

    # 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正 from queue import Queue import requests from lxml import etree ...

  5. Creating a Store Locator with PHP, MySQL & Google Maps(保存地图坐标 经纬度方法 google mysql)

    Google Geo APIs Team August 2009 This tutorial is intended for developers who are familiar with PHP/ ...

  6. WordPress新用户注册时提示“您的密码重设链接无效”

    在使用Wordpress密码找回功能及新用户注册邮件中的重置密码链接时,Wordpress提示“您的密码重设链接无效,请在下方请求新链接.”.“该key似乎无效”.“invalid key”. 这个其 ...

  7. css 添加手状样式,鼠标移上去变小手

    cursor:pointer, 简单实用. 前端工作一年多,竟然没有博客.说出来别人都要笑话,这是一个新的开始.

  8. 理解 Redux 的中间件

    将该思想抽象出来,其实和 Redux 就无关了.问题变成,怎样实现在截获函数的执行,以在其执行前后添加自己的逻辑. 为了演示,我们准备如下的示例代码来模拟 Redux dispatch action ...

  9. [go设计模式]简单工厂模式

    优点 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可 ...

  10. 微人事 star 数超 10k,如何打造一个 star 数超 10k 的开源项目

    看了下,微人事(https://github.com/lenve/vhr)项目 star 数超 10k 啦,松哥第一个 star 数过万的开源项目就这样诞生了. 两年前差不多就是现在这个时候,松哥所在 ...