中介者模式

用一个中介对象来封装一系列对象的交互,从而把一批原来可能是交互关系复杂的对象转换成一组松散耦合的中间对象,以有利于维护和修改。 --百度百科

中介者模式是将多对多的交互关系转化为一对多。软件中设计一个中介对象专门管理交互逻辑,如此一来便能够将各个对象间错综复杂的耦合统一到与中介对象耦合。

适用中介者模式的场景

  • 当多个组件或对象互相依赖,动一发而牵全身。
    该模式能够使各个组件相互独立,互不耦合,从而保证各个组件的修改互不牵连。

  • 当某些组件因为依赖其他组件,而无法复用时。
    采用中介者将组件间的依赖仅面向中介者。

  • 当需要在不同场景复用基本行为,导致被迫产生大量组件子类。
    由于所有组件间关系都被包含在中介者中, 因此你无需修改组件就能方便地新建中介者类以定义新的组件合作方式

典型案例

  1. 典型的租房案例。租房中介整合多个房东的房源,用户只需要从中介这里找到适合自己的房源即可。租房中介便将房东与用户的交互管理起来,多个房东和用户都只需与租房中介交互。

  2. 机场塔台场景。飞机在降落前需要提前了解降落方位,因此需要了解其他飞机的降落位置,从而获取到空闲的降落位置。每个飞机之间都要建立联系。

    飞机之间交互

从图上看,飞机之间关系相当复杂。降落飞机需要向所有的飞机发送请求信息并等待应答,效率低下。
为提高效率,引入塔台角色。塔台事先与其他飞机交互保存各个飞机的信息,当有飞机发送降落请求时,塔台根据保存的信息应答降落请求即可。如此一来,大大提升了交互效率。

塔台与飞机交互

中介者模式UML类图

这里以塔台案例为案例绘制UML类图。

中介者模式

  • CToWerBase: 塔台抽象类。
  • CChengduTower: 具体的塔台类,扮演中介者角色,与各个飞机交互。
  • CAirPlane: 飞机抽象类。
  • CAirBusA319、CBoeing737、CComacC919:具体的飞机类,只与塔台对象发生交互。

源码实现

本源码只实现了塔台与飞机间的交互框架,具体的飞机停靠业务逻辑没有体现。

客户端代码

int main(int argc, char *argv[])
{CChengduTowerMediator *theChengduTower = CChengduTowerMediator::GetInstance();CAirBusA319 *theAirBus319 = new CAirBusA319();theAirBus319->SetMediator(theChengduTower);CBoeing737  *theBoeing737 = new CBoeing737();theBoeing737->SetMediator(theChengduTower);CComacC919  *theCComacC919 = new CComacC919();theCComacC919->SetMediator(theChengduTower);// 塔台向所有飞机广播,通报姓名//MAIN_LOGI("--> Tower Radio: notify name\n");theChengduTower->NotifyObserverAll((char *)"Please notify your name");MAIN_LOG("\n");// AirBus319应答塔台//MAIN_LOGI("--> AirBus319 Notify\n");theAirBus319->Notify((char *)"This is AirBus319");MAIN_LOG("\n");// theBoeing737应答塔台//MAIN_LOGI("--> Boeing737 Notify\n");theBoeing737->Notify((char *)"This is Boeing737");MAIN_LOG("\n");// CComacC919应答塔台//MAIN_LOGI("--> CComacC919 Notify\n");theCComacC919->Notify((char *)"This is CComacC919");MAIN_LOG("\n");delete theAirBus319;delete theBoeing737;delete theCComacC919;return 0;
}

执行效果

$  ./exe
[CAirBusA319] Recv: Please notify your name
[CBoeing737] Recv: Please notify your name
[CComacC919] Recv: Please notify your nameTower Recv: [0] This is AirBus319
[CAirBusA319] Recv: AckTower Recv: [1] This is Boeing737
[CBoeing737] Recv: AckTower Recv: [2] This is CComacC919
[CComacC919] Recv: Ack

塔台接口

class CChengduTowerMediator : public CTowerMediatorBase
{
public:CChengduTowerMediator();~CChengduTowerMediator();static CChengduTowerMediator* GetInstance();// 注册飞机实例int Register(CAirplaneBase* airplane);// 注销指定飞机IDint UnRegister(int RegisterId);// 向指定飞机发送消息int SendMsg(int RegisterId, void *msg);// 向所有注册飞机发送广播int NotifyObserverAll(void *msg);// 接收飞机消息int Receive(int id, void *msg);private:// 飞机注册表std::map<int, CAirplaneBase*> mAirplaneHashTable;
};

飞机接口

class CAirBusA319 : public CAirplaneBase
{
public:CAirBusA319();~CAirBusA319();void SetMediator(CTowerMediatorBase *meditor);int Notify(void *msg);int Receive(void *msg);private:int mIdForMediator;CTowerMediatorBase *pmMeditor;
};

总结

  • 中介模式的实现不是太复杂,主要引进一个“中介”角色,将各个组件的交互全部转移到与“中介”交互中来。设计思想,便是将多对多杂乱无章的交互关系,梳理为一对多有序的交互。

  • 中介者模式的思想主要为尽量减少各个组件之间的耦合关系,将复杂的多对多耦合关系转化为中介者对各个组件一对多的耦合关系。

  • 中介者模式解除了各个组件之间的耦合,使其相对独立。自身改动不会影响其他组件代码的修改,同时顾忌其他组件的变化带来的影响。满足单一原则,更易维护。

  • 在软件的设计中,大都是多个设计模式搭配使用的,本篇实现不仅包含中介者模式还有观察者模式的体现。因此在面对具体的场景时,只根据其组件特性选择对应的一种或多种设计模式即可。


http://www.taodudu.cc/news/show-5708383.html

相关文章:

  • 基于NodeJS+VUE房屋中介管理系统的设计与实现
  • idea包或文件删除恢复
  • python制作贺卡
  • 俄罗斯套娃信封问题【python实现】
  • WPS for Linux 字体配置(字体缺失解决办法)
  • 热部署和热加载有什么区别?
  • webpack的热重载/热更新HMR是如何实现的
  • webpack和vue热更新
  • 到底什么是浏览器的热更新?(webpack版)
  • lua面试题:热更新简介、原理及示例
  • 一文解释到底什么是“APP热更新技术”?
  • 手把手教你利用Python爬虫采集二次元美女壁纸
  • 2023年盐城工学院五年一贯制专转本招生简章
  • 小善汇聚大爱 从“喂猪”到“喂兔”这份爱心已持续了5年
  • css 背景效果_前端初学大纲03~(CSS 概述)
  • Vue使用print.js连续打印多页A4表单
  • RandomErasing代码讲解与使用
  • 中缀表达式后缀表达式
  • 在线教学app开发完成后,测试步骤有哪些?
  • 20230115下载并编译RK3568开发板的OpenHarmony-3.1-Beta的步骤
  • URL及URL encoding 简述
  • 关于分布式存储系统中-CAP原则(CAP定理)与BASE理论比较
  • JMeter入门①——接口测试
  • spring boot创建新工程运行报错解决方案
  • WebView-WebChromeClient详解
  • 数据增强实测之Random Erasing
  • python实现简单的日期计算器
  • C语言日期计算器
  • 阴阳师人数最多的服务器,阴阳师堪称全服务器最佛系的神级玩家
  • 阴阳师2017 7服务器维护,阴阳师7月22日正式服务器更新维护公告

S12. 中介者模式相关推荐

  1. php中介模式,中介者模式(Mediator pattern)详解及PHP实现

    中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可 ...

  2. 设计模式之中介者模式(Mediator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

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

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

  4. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

  5. 17Mediator(中介者)模式

    技术交流QQ群:1027579432,欢迎你的加入! 1.Mediator(中介者)模式的动机 在软件构建过程中,经常会出现多个对象互相交互的情况,对象之间常常会维持一种复杂的引用关系.如果遇到一些需 ...

  6. 中介者模式 调停者 Mediator 行为型 设计模式(二十一)

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

  7. iOS设计模式——中介者模式

    2019独角兽企业重金招聘Python工程师标准>>> 何为中介者模式? 面向对象的设计鼓励把行为分散到不同对象中,这种分散可能导致对象之间的相互关联.在最糟糕的情况下,所有对象都彼 ...

  8. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  9. 设计模式 — 行为型模式 — 中介者模式

    目录 文章目录 目录 中介者模式 应用场景 代码示例 中介者模式 中介者模式,将其他对象之间的交互装在中介者对象中,达到松耦合.隐式引用.独立变化. 中介者模式与代理模式有相似之处.但是代理模式是结构 ...

最新文章

  1. R语言主成分分析PCA和因子分析EFA、主成分(因子)个数、主成分(因子)得分、主成分(因子)旋转(正交旋转、斜交旋转)、主成分(因子)解释
  2. Spring 详解(四):Spring MVC
  3. [状压dp]洛谷 P2157 学校食堂
  4. Xception,Inception-ResNet,SENet(Squeeze-and-Excitation)
  5. ax3000 梅林_用梅林午餐肉十分钟就能做出来的美食,超级美味又健康,午餐肉还是要选择中粮!...
  6. 浅谈人工智能:现状、任务构与统一
  7. 基于TI Davinci架构的双核嵌入式应用处理器OMAPL138开发入门
  8. Java随机产生两位数正整数
  9. 深入了解一下C语言scanf()库函数
  10. html调整中文文字间距,HTML 中调整文字间距,行间距和文字竖排
  11. 锐龙r5 3500u核显相当于什么显卡 r5 3500u相当于什么处理器
  12. Cisco路由器和交换机型号
  13. 我们向印度人学习什么?
  14. 36招搞定电脑一切难题!!!
  15. ad-hoc,软ap(windows无线网卡制作WIFI热点)
  16. oracle查看dlink,oracle创建dlink方法
  17. 【Java】log日志输出
  18. 给计算机老师发一封信,写给计算机老师的感谢信.doc
  19. APP打开提示 应用未安装
  20. “爱运动管理系统”培训结业考试卷

热门文章

  1. U盘打开全是chk文件!这是为什么?该怎么恢复?
  2. 分布式理论:2pc与3pc
  3. 工作效率软件:番茄土豆 http://pomotodo.com/
  4. Qt Quick里的图形效果——颜色(Color)
  5. [Python基础05]输入输出选择和循环
  6. java 6 7 区别大吗_java基础(1)-比较jdk5,jdk6,jdk7的新特性
  7. 2021.2.17动态规划基础测试T3
  8. 物化视图和普通视图的区别
  9. 2019微信公开课PRO:百果园获 “年度智慧服务”奖
  10. Howmuch:2018年全球科技行业巨头版图