中介者模式结构图

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

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

其中:

  • Mediator(中介者)定义一个接口用于各同事(Colleague)对象通信。
  • ConcreteMediator(具体中介者)通过协调同事对象实现协作行为;了解并维护它的各个同事。
  • Collegue class(同事类)知道它的中介者对象;每一个同事类对象在需要与其他同事通信的时候与它的中介通信。

应用举例

房屋出租。

#include <iostream>
#include <string>
#include <vector>
using namespace std;class Mediator;//抽象人
class Person
{
public:virtual void SetMediator(Mediator *mediator) {} //设置中介virtual void SendMessage(string message) {}    //向中介发送信息virtual void GetMessage(string message) {}     //从中介获取信息protected:Mediator *m_mediator; //中介
};//抽象中介机构
class Mediator
{
public:virtual void Send(string message, Person *person) {}virtual void SetA(Person *A) {}  //设置其中一方virtual void SetB(Person *B) {}
};//租房者
class Renter : public Person
{
public:void SetMediator(Mediator *mediator) { m_mediator = mediator; }void SendMessage(string message) { m_mediator->Send(message, this); }void GetMessage(string message) { cout << "租房者收到信息" << message; }
};
//房东
class Landlord : public Person
{
public:void SetMediator(Mediator *mediator) { m_mediator = mediator; }void SendMessage(string message) { m_mediator->Send(message, this); }void GetMessage(string message) { cout << "房东收到信息:" << message; }
};
//房屋中介
class HouseMediator : public Mediator
{
private:Person *m_A; //租房者Person *m_B; //房东
public:HouseMediator() : m_A(0), m_B(0) {}void SetA(Person *A) { m_A = A; }void SetB(Person *B) { m_B = B; }void Send(string message, Person *person){if (person == m_A) //租房者给房东发信息m_B->GetMessage(message); //房东收到信息elsem_A->GetMessage(message);}
};int main()
{Mediator *mediator = new HouseMediator();Person *person1 = new Renter();    //租房者Person *person2 = new Landlord();  //房东mediator->SetA(person1);mediator->SetB(person2);person1->SetMediator(mediator);person2->SetMediator(mediator);person1->SendMessage("我想北京海淀租套房子,价格7000元一个月\n");person2->SendMessage("出租北京海淀房子,70平米,6500元一个月\n");getchar();return 0;
}

适用性

  • 一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
  • 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  • 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

设计模式-中介者模式相关推荐

  1. Python设计模式-中介者模式

    Python设计模式-中介者模式 代码基于3.5.2,代码如下; #coding:utf-8 #中介者模式class colleague():mediator = Nonedef __init__(s ...

  2. 7. 星际争霸之php设计模式--中介者模式

    题记 ============================================================================== 本php设计模式专辑来源于博客(jy ...

  3. 【设计模式】Java设计模式 - 中介者模式

    Java设计模式 - 中介者模式

  4. 设计模式中介者模式-备忘录模式-状态模式

    设计模式 中介者模式 基本介绍 中介者模式使用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式属于行为模式,使 ...

  5. 设计模式-中介者模式(Mediator Pattern)

    设计模式-中介者模式(Mediator Pattern) 文章目录 设计模式-中介者模式(Mediator Pattern) 一.定义 二.概念解释 三.场景 四.实现 1.类图 2.代码实现 五.总 ...

  6. 大话设计模式—中介者模式

    中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护.中介者模式属于行为型模式. ...

  7. [设计模式]中介者模式之Events消息传递实现

    这篇文章比较短,修改自 写给大家看的设计模式之中介者中的例子 中介者模式的定义和目的自不必说, 参考上文即可. 本文针对实现方式做一个补充. 中介者模式增加了一个第三方对象(中介者)来控制两个对象(同 ...

  8. C++设计模式-中介者模式

    目录 基本概念 代码与实例 基本概念 中介者模式(Mediator)用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的关系. 下面 ...

  9. 学习设计模式 - 中介者模式

    中介者模式 一丶定义 定义一个中介者对象, 封装一系列对象的交互关系, 使得各对象不必显示的相互引用, 从而使其耦合松散, 而且可以独立的改变它们的交互 二丶理解 各对象显式地持有对方引用, 用于对象 ...

  10. PHP设计模式——中介者模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 中介者模式用一个中介者对象来封装一系列的对象交互.中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的 ...

最新文章

  1. 常见的容错机制+failover+failback
  2. c语言实战1200例 pdf6,C语言程序设计6.6.2.pdf
  3. 网络编程(part9)--socket套接字编程之TCP套接字
  4. Github git 命令下载加速
  5. java openssl_verify_CryptoAPI:如何使用CryptVerifySignature验证来自OpenSSL或Java的DSA签名...
  6. shell脚本批量导出MYSQL数据库日志/按照最近N天的形式导出二进制日志[连载之构建百万访问量电子商务网站]...
  7. .net中三种Timer使用总结
  8. kong 网关教程入门
  9. pygame之key模块
  10. 2022年低压电工考试题及在线模拟考试
  11. H5 微信分享显示标题和图标
  12. 龙芯3a4000 交叉编译链接错误
  13. NLP揭秘:除了宝石,女儿也是灭霸的真爱(附代码)
  14. android常用地图坐标转换
  15. 2021-7-28-自动化运维Ansible
  16. [Irving]字符串相似度-字符编辑距离算法(c#实现)
  17. 线上测评图形题技巧二
  18. 小红书竞品分析_App竞品分析报告:小红书VS洋码头
  19. 用python画花瓣-用python画花瓣
  20. 抖音上的战斗力测试软件,抖音战斗力测试app

热门文章

  1. 【PHP】\r \r\n \t是什么
  2. Chrome浏览器占用CPU资源过高(Software Reporter Tool)
  3. c 语言 如何优化cpu占用率,C#程序优化-有效减少CPU占用率
  4. msxml3.dll 错误 '80072efd' ---asp 网站报错
  5. vs2017 错误:当前页面的脚本发生错误
  6. WD移动硬盘无法存储,提示空间不够(已解决)——当移动硬盘遇到坚果云
  7. win7默认网关不可用怎么修复 win7默认网关不可用的快速解决方法
  8. 10bit色深灰度图彩色图加载显示
  9. 10bit视频是什么?
  10. 解决使用Keil5不能生成bin文件或生成的是.bin文件夹问题