中介者模式

模式定义

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

模式动机

  • 尽管讲一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性了。大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了
  • 中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制以一个分布在多个类中的行为,而又不想生成太多的子类的场合。

UML类图

源码实现

  • colleague.h
#include <string>

class Mediator;
class Colleague
{
public:
Colleague(Mediator* mediator);
virtual ~Colleague();
virtual void Notify(std::string message) = 0;
void Send(std::string message); private:
Mediator* m_Mediator;
};
  • concretecolleague.h
#include "colleague.h"

class Mediator;
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator* mediator);
void Notify(std::string message) override; private:
Mediator* m_Mediator;
};
  • concretecolleague.cpp
#include "colleague.h"

class Mediator;
class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator* mediator);
void Notify(std::string message) override; private:
Mediator* m_Mediator;
};
  • mediator.h
#include <string>
class Colleague;
class Mediator
{
public:
Mediator();
void Send(std::string message, Colleague* colleague); void SetColleague1(Colleague* colleague);
void SetColleague2(Colleague* colleague);
private:
Colleague* m_Colleague1;
Colleague* m_Colleague2;
};
  • mediator.cpp
#include <string>
class Colleague;
class Mediator
{
public:
Mediator();
void Send(std::string message, Colleague* colleague); void SetColleague1(Colleague* colleague);
void SetColleague2(Colleague* colleague);
private:
Colleague* m_Colleague1;
Colleague* m_Colleague2;
};
  • main.cpp
#include <iostream>
#include "concretecolleague1.h"
#include "concretecolleague2.h"
#include "mediator.h" using namespace std; int main()
{
Mediator* mediator = new Mediator(); Colleague* c1 = new ConcreteColleague1(mediator);
Colleague* c2 = new ConcreteColleague2(mediator); mediator->SetColleague1(c1);
mediator->SetColleague2(c2); c1->Send("吃了吗");
c2->Send("我吃过了,你呢");
return 0;
}
  • 运行结果

同事2得到消息:吃了吗

同事1得到消息:我吃过了,你呢

优点

中介者模式的优点

  • 中介者模式很容易在系统中应用,也很容易在系统中应用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先烦死你的系统在设计上是不是合理。
  • Mediator的出现减少了各个Colleague的耦合,使得可以独立的改变和复用各个Colleague类和Mediator。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。

缺点

中介者模式的缺点

  • 由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。

中介者模式(c++实现)的更多相关文章

  1. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  2. MediatorPattern(中介者模式)

    /** * 中介者模式 * @author TMAC-J * 研究了这么多设计模式,觉得无非就是几点: * 1.若两个类有耦合关系,设立一个中间类,处理两个类的关系,把两个类的耦合降低 * 2.面向接 ...

  3. C#设计模式-中介者模式

    在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 一. 中介者(Mediator)模式 从 ...

  4. php实现设计模式之 中介者模式

    <?php /* * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ /* * 以一个同学qq群为例说明, ...

  5. 轻松掌握:JavaScript代理模式、中介者模式

    代理模式.中介者模式 代理模式 在面向对象设计中,有一个单一职责原则,指就一个类(对象.函数)而言,应该仅有一个引起它变化的原因.如果一个对象承担了过多的职责,就意味着它将变得巨大,引起它变化的原因就 ...

  6. java设计模式之中介者模式

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

  7. 中介者模式(Mediator Pattern)

    定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. Mediator:中介者接口.在里面定义了各个同事之间相互交互所 ...

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

    Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...

  9. JAVA 设计模式 中介者模式

    用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...

  10. (七)中介者模式-C++实现

    用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...

随机推荐

  1. 多语言工作者の十日冲刺<8/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第八天(05.07) 作业正文 ...

  2. js Date format(日期格式化:yyyy-MM-dd HH:mm:ss.S)

    今天在做日期显示的时候,那个显示格式困扰了很久,各种组件都尝试了,总是不如意,最后自己网上找了一个,然后稍微修改一下,感觉这个Util挺常用的,这里mark一下 Date.prototype.form ...

  3. Perl入门(一)Perl的基本类型及运算符

    在学习Perl的基础之前,还是希望大家有空去看以下Perl的简介.百度百科 一.Perl的基本类型 Per的基本类型分为两种:数值型和字符串型. 数值型可细分为 整数型.如123. 浮点型.如123. ...

  4. Spring学习笔记下载

    动力节点的spring视频教程相当的经典:下载地址 https://pan.baidu.com/s/1eTSOaae

  5. Spring:如何实现注解的组合

    Spring中存在很多注解组合的情况,例如@RestController @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @ ...

  6. vue环境配置脚手架搭建,生命周期,钩子

    Vue项目环境搭建 """ node ~~ python:node是用c++编写用来运行js代码的 npm(cnpm) ~~ pip:npm是一个终端应用商城,可以换国内 ...

  7. node+ajax实战案例(3)

    3.用户注册实现 3.1.注册用户功能的实现逻辑 1 用户在表单上输入注册信息 2 点击注册后,收集用户在表单上输入的注册信息并且发送给后台 3 后台接收用户发送过来的注册信息 4 后台需要处理数据并 ...

  8. 一个比CBitmap更优秀的类 -- CImage类

    Visual C++的CBitmap类的功能是比较弱的,它只能显示出在资源中的图标.位图.光标以及图元文件的内容,而不像VB中的Image控件可以显示出绝大多数的外部图像文件(BMP.GIF.JPEG ...

  9. [POI2014]FAR-FarmCraft (树规+贪心)

    题干 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...

  10. Zip破解工具Fcrackzip使用简介

    0x00 fcrackzip简单介绍 fcrackzip是一款专门破解zip类型压缩文件密码的工具,工具小巧方便.破解速度快,能使用字典和指定字符集破解,适用于linux.mac osx 系统 0x0 ...