- 介绍
- 范例
- ifndef MEDIATOR_H
- define MEDIATOR_H
- include “colleague.h”
- endif // MEDIATOR_H
- ifndef CONCRETEMEDIATOR_H
- define CONCRETEMEDIATOR_H
- include
- include “mediator.h”
- endif // CONCRETEMEDIATOR_H
- ifndef COLLEAGUE_H
- define COLLEAGUE_H
- endif // COLLEAGUE_H
- ifndef CONCRETECOLLEAGUE_H
- define CONCRETECOLLEAGUE_H
- include
- include “mediator.h”
- include “colleague.h”
- endif // CONCRETECOLLEAGUE_H
- include “concretecolleague.h”
- include “concretemediator.h”
title: “ C++设计模式-中介者模式\t\t”
tags:
- c++
- 设计模式
url: 806.html
id: 806
categories: - C/C++
date: 2017-12-23 19:40:14
介绍
- Mediator 抽象中介者角色 抽象中介者角色定义统一的接口, 用于各同事角色之间的通信。
- Concrete Mediator 具体中介者角色 具体中介者角色通过协调各同事角色实现协作行为, 因此它必须依赖于各个同事角色。
- Colleague 同事角色 每一个同事角色都知道中介者角色, 而且与其他的同事角色通信的时候, 一定要通过中介者角色协作。
每个同事类的行为分为两种:
- 自发行为(Self-Method):同事本身的行为, 比如改变对象本身的状态, 处理自己的行为等,与其他的同事类或中介者没有任何的依赖
- 依赖方法(DepMethod):必须依赖中介者才能完成的行为
优点: 一对多的依赖变成了一对一,降低耦合 缺点: 同事类越多, 中介者的逻辑就越复杂 应用:机场调度中心、MVC框架、媒体网关、中介服务
范例
抽象中介
ifndef MEDIATOR_H
define MEDIATOR_H
include “colleague.h”
class Mediator {
public:
virtual void setC1(Colleague c1) = 0;
virtual void setC2(Colleague c2) = 0;
virtual void doSomething1() = 0;
virtual void doSomething2() = 0;
};
endif // MEDIATOR_H
具体中介
ifndef CONCRETEMEDIATOR_H
define CONCRETEMEDIATOR_H
include
include “mediator.h”
class ConcreteMediator : public Mediator {
public:
void setC1(Colleague c1) override {
c1_ = c1;
}
void setC2(Colleague c2) override {
c2 = c2;
}
void doSomething1() override {
qDebug()<<”mediator get c1 sended message”;
c2->selfMethod();
}
void doSomething2() override {
qDebug()<<”mediator get c2 sended message”;
c1->selfMethod();
}
private:
Colleague *c1;
Colleague *c2_;
};
endif // CONCRETEMEDIATOR_H
抽象同事
ifndef COLLEAGUE_H
define COLLEAGUE_H
class Colleague {
public:
virtual void depMethod() = 0;
virtual void selfMethod() = 0;
};
endif // COLLEAGUE_H
具体同事-两个
ifndef CONCRETECOLLEAGUE_H
define CONCRETECOLLEAGUE_H
include
include “mediator.h”
include “colleague.h”
class ConcreteColleague1 : public Colleague {
public:
//通过构造函数传递中介者
ConcreteColleague1(Mediator mediator) {
mediator = mediator;
}
//自有方法 self-method
void selfMethod() override {
qDebug()<<”c1 get mediator message”;
}
//依赖方法 dep-method
void depMethod() override {
qDebug()<<”c1 send message”;
mediator->doSomething1();
}
private:
Mediator mediator;
};
class ConcreteColleague2 : public Colleague {
//通过构造函数传递中介者
public:
ConcreteColleague2(Mediator *mediator) {
mediator = mediator;
}
void selfMethod() override {
qDebug()<<”c2 get mediator message”;
}
void depMethod() override {
qDebug()<<”c2 send message”;
mediator->doSomething2();
}
private:
Mediator *mediator;
};
endif // CONCRETECOLLEAGUE_H
使用
include “concretecolleague.h”
include “concretemediator.h”
int main(int argc, char argv[]) {
//建立中介,完成联系
Mediator m = new ConcreteMediator;
Colleague c1 = new ConcreteColleague1(m);
Colleague c2 = new ConcreteColleague2(m);
m->setC1(c1);
m->setC2(c2);
c1->depMethod();
c2->depMethod();
}
结果
c1 send message
mediator get c1 sended message
c2 get mediator message
c2 send message
mediator get c2 sended message
c1 get mediator message
同事类要使用构造函数注入中介者, 而中介者使用getter/setter方式注入同事类, 因为同事类必须有中介者, 而中介者却可以只有部分同事类 源码GitHub:CppDesignPattern 相关链接:C++设计模式