行为模式2-中介者模式
中介者模式 Mediator
意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
问题思考
面向对象设计鼓励将行为分布到各个对象中。这种分布可能会导致对象间有许多连接。在最坏的情况下,每一个对象都知道其它所有对象。
适用性
- 一组对象通过定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象
类图
实现
class Mediator {
public:
void Operation1() {
mObj1->Operation1();
}
void Operation2() {
mObj2->Operation2();
}
void Operation3() {
mObj3->Operation3();
}
private:
ConcreteColleague1 *mObj1 = nullptr;
ConcreteColleague2 *mObj2 = nullptr;
ConcreteColleague3 *mObj3 = nullptr;
};
class ConcreteColleague1 {
public:
explicit ConcreteColleague1(Mediator *mediator) { mMediator = mediator; }
void Operation1() {
mMediator->Operation2();
}
private:
Mediator *mMediator = nullptr;
};
class ConcreteColleague2 {
public:
explicit ConcreteColleague2(Mediator *mediator) { mMediator = mediator; }
void Operation2() {
std::cout << "Hello mediator 2" << std::endl;
mMediator->Operation3();
}
private:
Mediator *mMediator = nullptr;
};
class ConcreteColleague3 {
public:
void Operation3() {
std::cout << "Hello Mediator" << std::endl;
}
private:
Mediator *mMediator = nullptr;
};
注意:在中介模式中,每一个同事类都知道它的中介者对象。每一个同事对象在需要与其他的同事通信的时候,与它的中介者通信。
Mediator和Facade:Mediator的目的是简化对象间通信,各对象只知道Mediator而不知道Colleague对象。Facade的目的是封装子系统,简化客户的访问。Mediator模式中,各对象只能通过mediator通信,这种通信可以是双向的。Facade模式中,只能通过facade访问子对象,子对象不能访问facade,这种同性方式是单向的。