大话设计模式--中介者模式 Mediator --C++实现实例
1. 中介者模式: 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立改变他们之间的交互。
Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator.
由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者变为比任何一个ConcreteColleague都复杂。
中介者模式一般应用于一组对象以定义良好但复杂的方式进行通信的场合,以及想定制一个分部在多个类中的行为,而又不想生成太多的子类的场合。
实例:
colleague.h colleague.cpp
#ifndef COLLEAGUE_H
#define COLLEAGUE_H class Mediator; class Colleague
{
public:
Colleague(Mediator *mediator); protected:
Mediator *mediator;
}; #endif // COLLEAGUE_H
#include "colleague.h"
#include "mediator.h" Colleague::Colleague(Mediator *mediator)
{
this->mediator = mediator;
}
concretecolleague1.h concretecolleague1.cpp
#ifndef CONCRETECOLLEAGUE1_H
#define CONCRETECOLLEAGUE1_H #include "colleague.h"
#include "mediator.h"
#include <string>
using namespace std; class ConcreteColleague1 : public Colleague
{
public:
ConcreteColleague1(Mediator *mediator);
void send(string message);
void notify(string message);
}; #endif // CONCRETECOLLEAGUE1_H
#include "concretecolleague1.h"
#include <iostream>
using namespace std; ConcreteColleague1::ConcreteColleague1(Mediator *mediator) : Colleague(mediator)
{
} void ConcreteColleague1::send(string message)
{
mediator->send(message, this);
} void ConcreteColleague1::notify(string message)
{
cout << "Colleague1 get a message: " << message << endl;
}
concretecolleague2.h concretecolleague2.cpp
#ifndef CONCRETECOLLEAGUE2_H
#define CONCRETECOLLEAGUE2_H #include "colleague.h"
#include "mediator.h"
#include <string>
using namespace std; class ConcreteColleague2 : public Colleague
{
public:
ConcreteColleague2(Mediator *mediator);
void send(string message);
void notify(string message);
}; #endif // CONCRETECOLLEAGUE2_H
#include "concretecolleague2.h"
#include <iostream>
using namespace std; ConcreteColleague2::ConcreteColleague2(Mediator *mediator) : Colleague(mediator)
{
} void ConcreteColleague2::send(string message)
{
mediator->send(message, this);
} void ConcreteColleague2::notify(string message)
{
cout << "Colleague2 get a message: " << message << endl;
}
mediator.h mediator.cpp
#ifndef MEDIATOR_H
#define MEDIATOR_H #include "colleague.h"
#include <string>
using namespace std; class Mediator
{
public:
Mediator();
void virtual send(string message, Colleague *colleague)=0;
}; #endif // MEDIATOR_H
#include "mediator.h" Mediator::Mediator()
{
}
concretemediator.h concretemediator.cpp
#ifndef CONCRETEMEDIATOR_H
#define CONCRETEMEDIATOR_H #include "mediator.h"
#include "concretecolleague1.h"
#include "concretecolleague2.h" class ConcreteMediator : public Mediator
{
public:
ConcreteMediator();
void setcolleague1(ConcreteColleague1 *colleague);
void setcolleague2(ConcreteColleague2 *colleague);
void send(string message, Colleague *colleague); private:
ConcreteColleague1 *colleague1;
ConcreteColleague2 *colleague2;
}; #endif // CONCRETEMEDIATOR_H
#include "concretemediator.h" ConcreteMediator::ConcreteMediator()
{
} void ConcreteMediator::send(string message, Colleague *colleague)
{
if( colleague == colleague1 )
colleague2->notify(message);
else
colleague1->notify(message); } void ConcreteMediator::setcolleague1(ConcreteColleague1 *colleague)
{
this->colleague1 = colleague;
} void ConcreteMediator::setcolleague2(ConcreteColleague2 *colleague)
{
this->colleague2 = colleague;
}
main.cpp
#include <iostream>
#include "concretecolleague1.h"
#include "concretecolleague2.h"
#include "concretemediator.h"
using namespace std; int main()
{
cout << "Mediator test!" << endl; ConcreteMediator *m = new ConcreteMediator();
ConcreteColleague1 *c1 = new ConcreteColleague1(m);
ConcreteColleague2 *c2 = new ConcreteColleague2(m);
m->setcolleague1(c1);
m->setcolleague2(c2);
c1->send("I come from C1, how are you? ");
c2->send("I come from C2, I am fine. "); return 0;
}
大话设计模式--中介者模式 Mediator --C++实现实例的更多相关文章
- 设计模式-中介者模式(Mediator)
场景分析: 众所周知,电脑有很多组成部分,如硬盘.内存.光驱.音频.键盘等,各个组件之间协同工作才能保证电脑的正常运行. 如果各个组件之间直接交互,可能会比较复杂,如下图: 将上面的各个组件抽象成类, ...
- 23种设计模式--中介者模式-Mediator Pattern
一.中介者模式的介绍 中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...
- 大话设计模式--享元模式 Flyweight -- C++实现实例
1. 享元模式: 运用共享技术有效地支持大量细粒度的对象. 享元模式可以避免大量非常相似类的开销,在程序设计中,有时需要生成大量颗粒度的类实例来表示数据,如果能发现这些实例除了几个参数外基本都是相同的 ...
- 大话设计模式--装饰者模式 Decorator -- C++实现实例
1.装饰者模式 Decorator 动态地给一个对象添加一个额外的职责, 就添加功能来说, 装饰模式比生成子类更为灵活. 每个装饰对象的实现和如何使用这个对象分离, 每个装饰对象只关心自己的功能,不 ...
- 深入浅出设计模式——中介者模式(Mediator Pattern)
模式动机 在用户与用户直接聊天的设计方案中,用户对象之间存在很强的关联性,将导致系统出现如下问题: 系统结构复杂:对象之间存在大量的相互关联和调用,若有一个对象发生变化,则需要跟踪和该对象关联的其他 ...
- 【转】设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据"单一职责原则",我们应该尽量将对象细化,使其只负责或呈现单一的职 ...
- 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)
设计模式 ( 十五 ) 中介者模式Mediator(对象行为型) 1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各 ...
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
原文:乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:weba ...
- 设计模式系列之中介者模式(Mediator Pattern)——协调多个对象之间的交互
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- IDC机房带宽突然暴涨问题!
IDC机房带宽突然暴涨问题! 1[提出问题] [实际案例一] 凌晨3:00点某公司(网站业务)的一个IDC机房带宽流量突然从平时高峰期150M猛增至1000M,如下图: 该故障的影响:直接导致数百台服 ...
- Jenkins入门(一)
Jenkins就是一个Java Web应用,它主要是干什么呢? 其实很简单: 下载一个jenkins的war包,然后扔到tomcat 的webapps中,启动这个tomcat,访问jenkins应用即 ...
- Oracle中NVL、NVL2、NULLIF 三个函数的区别?
首先说明:NULL指的是空值,或者非法值. 1.NVL (expr1, expr2)expr1为NULL,返回expr2:不为NULL,返回expr1.注意两者的类型要一致 2.NVL2 (expr1 ...
- SourceTree超前一个版本,落后N个版本
SourceTree超前一个版本,落后N个版本 在使用SourceTree的时候经常会遇见超前一个版本,落后N个版本的情况,遇见这种情况应该怎么办呢? 首先打开终端,最好是从SourceTree里 ...
- 不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1;
答案:一. int strcmp(char *source, char *dest) { /* assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stder ...
- RMQ with Shifts(线段树)
RMQ with Shifts Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u Pra ...
- [php]Maximum function nesting level of '100' reached错误
今天在做后台一个模块的时候报出了这个错误. Maximum function nesting level of '100' reached 仔细分析之后发现是在类的初始化过程中(__construct ...
- Linux安装Nignx基于域名的多虚拟主机实战
看这个文章之前,要保证你的Nginx已经安装成功! 如果没有,请移步到下面这个文章,看完后再回来看! https://www.cnblogs.com/apollo1616/p/10214531.htm ...
- linux nginx完全卸载
Nginx虽然好用,但是一旦关键配置文件被修改,想要卸载重装却是相当困难.本人因为采用apt-get方式安装后又源码安装了Nginx,结果出现冲 突,卸载不了,安装不上,很是蛋疼.主要的问题还 ...
- linux 中解压与压缩 常用操作详细讲解
平时有时候 会在服务器进行一些文件的操作,比如安装一些服务与软件等等,都有解压操作,一般在 导出一些简单的服务器文件,也是先压缩后再导出,因此,在这里根据平时用到解压与压缩命令的频率来记录下: 1.最 ...