C++行为型模式-中介者模式
1 模式介绍
中介者模式(Mediator Pattern):用一个中介对象来封装一系列的对象交互,中介者使得各对象不需要显示地相互引用,从而使得耦合松散,而且可以独立地改变它们之间的交互。
面向对象设计鼓励将行为分布到各个对象中。但是,这种分布可能会导致对象间有许多连接。每一个对象都知道其他所有对象,就造成了复杂的关系。对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。
中介者模式是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
2 模式结构
(1)抽象中介者(Mediator)
抽象中介者用于定义一个接口,接口用于各同事之间的通信。
(2)具体中介者(ConcreteMediator)
具体中介者是抽象中介者的子类,通过协调各个同事对象来实现协作行为,了解并维护它对各个同事对象的引用。
(3)抽象同事类(Colleague)
抽象同事类定义各同事的公有方法。
(4)具体同事类(ConcreteColleague)
具体同事类是抽象同事类的子类,每一个同事对象都引用一个中介者对象;
每一个同事对象在需要和其他同事对象通信时,先与中介者通信,通过中介者来间接完成与其他同事类的通信;
3 模式优缺点
3.1 优点
(1)简化了对象之间的交互。用中介者和同事的一对多的关系代替了原来同事之间的多对交互。
(2)将各同事解耦。中介者有利于各同事之间的松耦合。
(3)减少子类生成。
3.2 缺点
在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使能系统难以维护。
4 模式应用
(1)系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱难以理解。
(2)一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
5 模式实现
利用中介者模式实现聊天是功能。
#include <iostream>
using namespace std;#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
//抽象中介者
class Mediator;
//抽象同事类
class Colleague
{
public:Colleague(Mediator *pMediator) : m_pMediator(pMediator){}virtual void Send(char *message) = 0;protected:Mediator *m_pMediator;
};//具体同事类1
class ConcreteColleague1 : public Colleague
{
public:ConcreteColleague1(Mediator *pMediator) : Colleague(pMediator){}void Send(char *message);void Notify(char *message){wcout<<message<<endl;}
};
//具体同事类2
class ConcreteColleague2 : public Colleague
{
public:ConcreteColleague2(Mediator *pMediator) : Colleague(pMediator){}void Send(char *message);void Notify(char *message){cout<<"ConcreteColleague2 is handling the message."<<endl;wcout<<message<<endl;}
};//抽象中介者类
class Mediator
{
public:virtual void Sent(char *message, Colleague *pColleague) = 0;
};//具体中介者类
class ConcreteMediator : public Mediator
{
public:// The mediator forward the messagevoid Sent(char *message, Colleague *pColleague){ConcreteColleague1 *pConcreteColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);if (pConcreteColleague1){cout<<"The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2"<<endl;if (m_pColleague2){m_pColleague2->Notify(message);}}else{if (m_pColleague1){m_pColleague1->Notify(message);}}}void SetColleague1(Colleague *pColleague){m_pColleague1 = dynamic_cast<ConcreteColleague1 *>(pColleague);}void SetColleague2(Colleague *pColleague){m_pColleague2 = dynamic_cast<ConcreteColleague2 *>(pColleague);}private:// The Mediator knows all the ColleagueConcreteColleague1 *m_pColleague1;ConcreteColleague2 *m_pColleague2;
};void ConcreteColleague1::Send(char *message)
{// The second parameter mark where the message comes fromm_pMediator->Sent(message, this);
}void ConcreteColleague2::Send(char *message)
{m_pMediator->Sent(message, this);
}int main()
{// Create the mediatorMediator *pMediator = new ConcreteMediator();Colleague *pColleague1 = new ConcreteColleague1(pMediator);Colleague *pColleague2 = new ConcreteColleague2(pMediator);ConcreteMediator *pConcreteMediator = dynamic_cast<ConcreteMediator *>(pMediator);pConcreteMediator->SetColleague1(pColleague1);pConcreteMediator->SetColleague2(pColleague2);char message[260] = "Where are you from?";pColleague1->Send(message);return 0;
}
输出信息:
The message is from ConcreteColleague1. Now mediator forward it to ConcreteColleague2
ConcreteColleague2 is handling the message.
Where are you from?
6 中介者与外观者模式的区别
外观模式与中介者模式的不同之处在于,外观模式是对一个对象子系统进行抽象,从而提供了一个更为方便的接口;外观模式的协议是单向的,即外观模式向子系统提出请求,但反过来则不行;而对于中介者模式,是进行多个对象之间的协作,通信是多向的。
参考文献:
【1】C++设计模式——中介者模式 - Ring_1992 - 博客园
【2】中介者模式 | 菜鸟教程
C++行为型模式-中介者模式相关推荐
- 设计模式-行为型模式-中介者模式
设计模式-行为型模式-中介者模式 行为型模式 划分类和对象的职责. 中介者模式 进销存管理,即采购,销售,库存. 其中类图 代码如下 public class Purchase {// 采购IBM电脑 ...
- Java设计模式之行为型:中介者模式
前言: 在我们的生活中处处充斥着"中介者",比如你租房.买房.找工作.旅游等等可能都需要那些中介者的帮助,地球上国与国之间的关系异常复杂,会因为各种各样的利益关系来结成盟友或者敌 ...
- 第十九章行为型模式—中介者模式
文章目录 中介者模式 解决的问题 结构 实例 存在的问题 适用场景 中介者模式和代理模式的区别 代理模式 中介模式 桥接模式 总结 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间 ...
- 设计模式 — 行为型模式 — 中介者模式
目录 文章目录 目录 中介者模式 应用场景 代码示例 中介者模式 中介者模式,将其他对象之间的交互装在中介者对象中,达到松耦合.隐式引用.独立变化. 中介者模式与代理模式有相似之处.但是代理模式是结构 ...
- 《设计模式详解》行为型模式 - 中介者模式
中介者模式 6.7 中介者模式 6.7.1 概述 6.7.2 结构 6.7.3 案例实现 6.7.4 优缺点 6.7.5 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 6 ...
- php中介模式,中介者模式(Mediator pattern)详解及PHP实现
中介者模式是一种行为型模式,它包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,从而使它们可以松散偶合.当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用,保证这些作用可 ...
- 安卓适配器类中怎么调用intent_设计模式:代理模式/中介者模式 / 桥接模式/适配器 - 七星望...
模式某种角度上来讲就是对象组合.不要看他们都是对象组合就好像是一样的.模式的动机,意图,使用场合,组合方式,这些都是模式的一部分.其中细微的不同足以区分不同的模式. 行为模式的主要特点就是处理的是对象 ...
- 【设计模式】外观模式代理模式中介者模式的区别
外观模式 个人理解: 子类继承外观类的所有属性方法,客户端只需要跟外观类进行交流,实现了对所有子类的封装. 没有使用外观类 如图: 应用外观类 如图: 代理模式 个人理解: 代理模式是将原类进行封装, ...
- Java23种设计模式——19.行为型模式之中介者模式
Java中除去有设计原则之外,还有23中设计模式. 这些模式都是前辈们一点一点积累下来,一直在改进,一直在优化的,而这些设计模式可以解决一些特定的问题. 并且在这些模式中,可以说是将语言的使用体现的淋 ...
- 行为型设计模式之中介者模式
中介者模式 中介者模式 应用场景 主要角色 优缺点 基本使用 创建抽象中介者 创建具体中介者 创建抽象同事类 创建具体同事类 客户端执行 中介者模式 中介者模式又称为调解者模式或调停者模式,属于行为型 ...
最新文章
- 最流行的解压缩软件--winrar
- 【十大经典数据挖掘算法】EM
- 顺序存储结构和链式存储结构的优缺点
- python识别文字tesseract
- ARM处理器的9种模式详解
- 基于SSM的小区报修系统
- Atiti 高并发程序设计 艾提拉著 目录 1. 第—部分 基础知识	2 1.1. 第1章 并行计算机的硬件基础 1.1 并行计算机的组成 1.2 共享存储器多处理器系统 1.3 消
- mfc控件设置颜色(超全)
- 一个外国程序员中的中国程序员
- C语言:fflush()的用法以及缓冲区的概念
- 使用Hypothesis生成测试数据
- 15高级链接构建策略和技巧,以提高您的SEO
- TCP系列39—拥塞控制—2、拥塞相关算法及基础知识
- 【CSS 教程系列第 12 篇】什么是 CSS 中的伪类选择器
- 戴尔r510服务器加硬盘没反应,戴尔R510_R410_R610_R710等所有服务器安装win2003解决办法...
- 面试时如何优雅地自我介绍? 1
- 02 AE脚本开发使用什么编辑器
- PHP开发者的 PHP源代码 --之一 结构
- OSI模型的传输层,会话层,表示层,
- C语言复习:(四)函数指针