中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了中间者的角色,协调各方利益。

本文就以租房为例子,如果没有房屋中介,那么房客要自己找房东,而房东也要自己找房客,非常不方便。有了房屋中介机构就方便了,房东可以把要出租的房屋信息放到中介机构,而房客可以去中介机构咨询。在软件中,就是多个对象之间需要通信,如果没有中介,对象就需要知道其他对象,最坏情况下,可能需要知道所有其他对象,而有了中介对象就方便多了,对象只需与中介对象通信,而不用知道其他的对象。这就是中介者模式,下面以租房为例,给出中介者模式的UML图。

实现不难,下面给出C++的实现:

[cpp] view plaincopy print?
  1. class Mediator;
  2. //抽象人
  3. class Person
  4. {
  5. protected:
  6. Mediator *m_mediator; //中介
  7. public:
  8. virtual void SetMediator(Mediator *mediator){} //设置中介
  9. virtual void SendMessage(string message) {}    //向中介发送信息
  10. virtual void GetMessage(string message) {}     //从中介获取信息
  11. };
  12. //抽象中介机构
  13. class Mediator
  14. {
  15. public:
  16. virtual void Send(string message, Person *person) {}
  17. virtual void SetA(Person *A) {}  //设置其中一方
  18. virtual void SetB(Person *B) {}
  19. };
  20. //租房者
  21. class Renter: public Person
  22. {
  23. public:
  24. void SetMediator(Mediator *mediator) { m_mediator = mediator; }
  25. void SendMessage(string message) { m_mediator->Send(message, this); }
  26. void GetMessage(string message) { cout<<"租房者收到信息"<<message; }
  27. };
  28. //房东
  29. class Landlord: public Person
  30. {
  31. public:
  32. void SetMediator(Mediator *mediator) { m_mediator = mediator; }
  33. void SendMessage(string message) { m_mediator->Send(message, this); }
  34. void GetMessage(string message) { cout<<"房东收到信息:"<<message; }
  35. };
  36. //房屋中介
  37. class HouseMediator : public Mediator
  38. {
  39. private:
  40. Person *m_A; //租房者
  41. Person *m_B; //房东
  42. public:
  43. HouseMediator(): m_A(0), m_B(0) {}
  44. void SetA(Person *A) { m_A = A; }
  45. void SetB(Person *B) { m_B = B; }
  46. void Send(string message, Person *person)
  47. {
  48. if(person == m_A) //租房者给房东发信息
  49. m_B->GetMessage(message); //房东收到信息
  50. else
  51. m_A->GetMessage(message);
  52. }
  53. };

客户使用方式如下:

[cpp] view plaincopy print?
  1. //测试案例
  2. int main()
  3. {
  4. Mediator *mediator = new HouseMediator();
  5. Person *person1 = new Renter();    //租房者
  6. Person *person2 = new Landlord();  //房东
  7. mediator->SetA(person1);
  8. mediator->SetB(person2);
  9. person1->SetMediator(mediator);
  10. person2->SetMediator(mediator);
  11. person1->SendMessage("我想在南京路附近租套房子,价格800元一个月\n");
  12. person2->SendMessage("出租房子:南京路100号,70平米,1000元一个月\n");
  13. delete person1; delete person2; delete mediator;
  14. return 0;
  15. }

设计模式C++实现(13)——中介者模式相关推荐

  1. 设计模式(十一)中介者模式(调停者模式)

    1. 中介者模式定义 定义:用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互. 中介者模式结构图如下图所示. 在中介者模 ...

  2. 设计模式学习笔记--Mediator 中介者模式

    我们知道面向对象应用程序是由一组为了提供某种服务而彼此交互的对象组成.当彼此引用的对象数量比较少时,此时对象之间就为直接交互(点对点).而当对象的数量增加时,这种直接交互会导致对象之间复杂的.混乱的引 ...

  3. 设计模式笔记 16. Mediator 中介者模式(行为型模式)

    16. Mediator 中介者模式           2008-09-09 动机(Motivation) 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关 ...

  4. 设计模式之禅【中介者模式】

    真刀实枪之中介者模式 进销存管理,你管理的头大吗? 你可能会说,这有啥难的,先来幅模块示意图 从这个示意图可以看出,三个模块是相互依赖的,其中: 销售情况:销售部门要反馈情况,畅销就多采购 库存情况: ...

  5. 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式

    前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...

  6. 设计模式之略见一斑(Mediator中介者模式)

    设计模式 写道 通常,面向对象的软件开发要求尽可能细致地分配,从而使每个对象都能够独立完成自己的任务.Observer模式通过尽可能缩小一个对象应对其他对象承担的责任范围来支持这种责任分配.而sing ...

  7. 设计模式【18】——中介者模式( Mediator 模式)

    文章目录 前言 一.中介者模式( Mediator 模式) 二.具体源码 1.Colleage.h 2.Colleage.cpp 3.Mediator.h 4.Mediator.cpp 5.main. ...

  8. 设计模式 -- (14)中介者模式

    中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互.中介者模式的例子很多,大到联合国安理会,小到房屋中介,都扮演了 ...

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

    在对象去耦合的模式中,有两种模式:中介者模式,观察者模式 一,概念 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 这个 ...

  10. 设计模式~调停者(中介)模式-06

    调停者(中介)模式 优点 缺点 使用场景 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互. [四个"美女" ...

最新文章

  1. [转]Emacs 系列教程
  2. unicode_literals导致的UnicodeEncodeError
  3. 【转】自然语言系列学习之表示学习与知识获取(一)分布式表示
  4. PAT_B_1070_Java(25分)_C++(25分)
  5. future promise java_第四章 Future和Promise
  6. Ajax实现动态及时刷新表格数据
  7. Win10如何屏蔽删除电脑右下角的广告
  8. 异常处理:你不可能总是对的 - 零基础入门学习Python032
  9. linux 内核优化
  10. Tomcat8 安装后点击startup出现闪退的解决方法(转)
  11. python编程100例-Python3经典100例(①)
  12. 【链表】单链表的排序(归并排序)
  13. 初级程序员面试不靠谱指南(四)
  14. 如何将符号保存到php数据库当中并且打印出来!
  15. 区块链+高薪,你还等什么?
  16. Apizza-响应json数据上设置浮动注释
  17. OpenCV——相当通俗易懂的SVD奇异值分解
  18. Android Studio编译错误:Suggestion: use tools:overrideLibrary=xxx.xxx.xxx to force usage
  19. java SE的内容有什么_JavaSE包含哪些内容?JavaEE呢?
  20. 小程序页面onload(),onready()加载顺序

热门文章

  1. BigData:绘制2018年福布斯中国富豪榜人根据出生地绘制个人或其家族财富分布热点图
  2. DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字
  3. 成功解决Remix Mock compiler: Source not found
  4. 成功解决Instructions for updating: Use `tf.global_variables_initializer` instead.
  5. 51nod 1525 重组公司
  6. 洛谷P2826 [USACO08NOV]光开关Light Switching [2017年6月计划 线段树02]
  7. Oracle自定义数据类型 1
  8. initWithCoder: 与initWithFrame:
  9. Linux 平台下 RMAN 全备 和 增量备份 shell 脚本
  10. STM8S103F2 EEPROM读写