一. 举例

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

结构图如下:

代码如下:

  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. j2ee开发之Spring2.5框架学习笔记

    Spring 2.5框架学习笔记 1.是一个开源的控制反转IOC和面向切面AOP的容器框架 2.IOC控制反转 public class PersonServiceBean { private Per ...

  2. iSCSI 网关管理 - Storage6

    iSCSI网关集成了Ceph存储和iSCSI标准,以提供一个高可用性(HA) iSCSI目标,该目标将RADOS块设备(RBD)映像导出为SCSI磁盘.iSCSI协议允许客户机 (initiator) ...

  3. 国庆佳节第四天,谈谈我月收入增加 4K 的故事

    01.起承 在我下定决心改变的这将近 1 年的时间里,遇到了很多很多有故事的人,以及有趣的事.自我的认知改变特别大!尤其是收入,比去年同时期增加了 4K. 4K,可能也就买 100 斤猪肉.但是对于身 ...

  4. VR中的Redirection

    在虚拟现实(Virtual Reality,VR)中,很重要的一点就是用户的在虚拟环境中的漫游(navigation).除了固定视点的VR电影,一般的VR应用,特别是游戏或者其他交互式的应用,都会依赖 ...

  5. Java 学习笔记之 线程Yield

    线程Yield: yield()方法的作用是放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得CPU时间片. public class Yie ...

  6. Kafka 学习笔记之 ZooKeeper作用

    Kafka使用ZooKeeper 配置管理 Leader Election 服务发现 首先进入ZooKeeper客户端: ls / 可以看到有以下节点: 查看Topic 配置信息:体现了ZooKeep ...

  7. git checkout 提示 “error: The following untracked working tree files would be overwritten by checkout” 解决

    问题描述 Windows 或者 macOS 操作系统中,文件名是不区分大小写的.对于已经提交到仓库中的文件修改文件名的大小写,然后又用 git rm 命令将老文件从 Git 仓库删除掉,并保存下新的文 ...

  8. Spring Boot 2.x基础教程:Swagger静态文档的生成

    前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了.如果您还不熟悉这块,可以先阅读: Spring Boo ...

  9. Spring中@Import的各种用法以及ImportAware接口

    @Import 注解 @Import注解提供了和XML中<import/>元素等价的功能,实现导入的一个或多个配置类.@Import即可以在类上使用,也可以作为元注解使用. @Target ...

  10. 编译 lame for iOS

    网上找了许多编译lame的教程,结果都是编译失败,多次尝试后发现是编译脚本放错路径了,记录下编译的过程,把编译脚本放到源码文件夹中和修改编译脚本中的目录是关键: 一.首先去Lame官网 http:// ...