中介者模式(c++实现)
中介者模式
模式定义
中介者模式(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++实现)的更多相关文章
- 23种设计模式--中介者模式-Mediator Pattern
一.中介者模式的介绍 中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...
- MediatorPattern(中介者模式)
/** * 中介者模式 * @author TMAC-J * 研究了这么多设计模式,觉得无非就是几点: * 1.若两个类有耦合关系,设立一个中间类,处理两个类的关系,把两个类的耦合降低 * 2.面向接 ...
- C#设计模式-中介者模式
在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 一. 中介者(Mediator)模式 从 ...
- php实现设计模式之 中介者模式
<?php /* * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ /* * 以一个同学qq群为例说明, ...
- 轻松掌握:JavaScript代理模式、中介者模式
代理模式.中介者模式 代理模式 在面向对象设计中,有一个单一职责原则,指就一个类(对象.函数)而言,应该仅有一个引起它变化的原因.如果一个对象承担了过多的职责,就意味着它将变得巨大,引起它变化的原因就 ...
- java设计模式之中介者模式
中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...
- 中介者模式(Mediator Pattern)
定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. Mediator:中介者接口.在里面定义了各个同事之间相互交互所 ...
- C++设计模式-Mediator中介者模式
Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...
- JAVA 设计模式 中介者模式
用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...
- (七)中介者模式-C++实现
用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其解耦合松散而且可以独立地改变他们之间的交互. 中介者模式适合于 系统中不希望对象之间直接交互,即不希望类之间相互包含, ...
随机推荐
- linux 在指定文件夹下查找指定字符
grep -r '119090610015743205' /data/html/www/gap_bz_middleware/storage/apiLogs/
- Office2019 相关激活秘钥
零售版 W8W6K-3N7KK-PXB9H-8TD8W-BWTH9 批量板 N9J9Q-Q7MMP-XDDM6-63KKP-76FPM
- 当我们创建HashMap时,底层到底做了什么?
jdk1.7中的底层实现过程(底层基于数组+链表) 在我们new HashMap()时,底层创建了默认长度为16的一维数组Entry[ ] table.当我们调用map.put(key1,value1 ...
- SQL注入入门
这几天做了不少SQL注入题,对SQL注入有点体会,所以写写自己的学习历程与体会. 什么是SQL注入 SQL注入就是指web程序对用户输入的数据的合法性没有进行判断,由前端传入的参数带着攻击者控制的非法 ...
- python变量拷贝
写python代码时候,如:A = 0,B = A,B = 1, 有时候会发现A变成了1,那么怎么办呢? 以下是伪代码: import copy ... X_ = copy.copy(X) ... 这 ...
- Egret游戏大厅制作思路
Egret游戏大厅制作思路 Egret中,写好的代码最终都被打包到main.js里面,只有库文件会单独生成出来,按需加载. 游戏中有需求,要将一些游戏(或者模块)进行外包,然后从主游戏大厅中进入,那么 ...
- 《UNIX环境高级编程》(APUE) 笔记系列
本系列笔记主要是对于 <UNIX环境高级编程>(APUE) 各章节内容 概念性的总结 ,不涉及代码解读 . 目录 : 第一章 UNIX基础知识 第二章 UNIX标准及实现 第三章 文件I/ ...
- 【数据库内核】RocksDB:事务锁设计与实现
本文主要介绍 RocksDB 锁结构设计.加锁解锁过程,并与 InnoDB 锁实现做一个简单对比. 本文由作者授权发布,未经许可,请勿转载. 作者:王刚,网易杭研数据库内核开发工程师 MyRocks ...
- python中lambda匿名函数与函数之间的关系
- Volatile关键字的解读
原子性 定义: 在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行. Java内存模型只保证了基本读取和赋值是原子性操作,如果要实现更大范围 ...