设计模式-行为-Mediator(中介者)模式
对象之间的交互是很常见的需求了,如果系统非常大,对象很多,那么交互 通信起来的复杂度就大大增加了。需要
一个通信类来负责交互 这就是Meditator模式,还带来了系统间对象的松耦合
Mediator模式是一个很有用的模式,他把对对象间的通信封装到了一个类里面,把多对多的通信转换为一对多,降低了低通的复杂性,还具备系统解耦的特性,通过Mediator 各个colleague 就必须维护各自的通信对象和通信协议,降低了系统的耦合性,Mediator和colleague就可以相互独立的修改了。
还有个特点是集中控制,便于管理,也符合oop设计的 每个类单一职责和集中地原则

头文件
#pragma once
#include "PublicHeaders.h"
class Mediator;
class Colleague
{
public:
virtual void Action() = 0;
protected:
Mediator *_mediator;
friend class ConCreateMediator;
virtual void Sync() = 0;
};
class ConCreateColleagueA :public Colleague
{
public:
ConCreateColleagueA(Mediator*m);
virtual void Action()override;
private:
virtual void Sync()override;
};
class ConCreateColleagueB :public Colleague
{
public:
ConCreateColleagueB(Mediator*m);
virtual void Action()override;
private:
virtual void Sync()override;
};
class Mediator
{
public:
virtual void IntroColleague(Colleague*a, Colleague *b) = 0;
virtual void DoActionFromAtoB() = 0;
virtual void DoActionFromBtoA() = 0;
protected:
Colleague *colleague_A;
Colleague *colleague_B;
};
class ConCreateMediator :public Mediator
{
public:
virtual void IntroColleague(Colleague*a, Colleague *b)override;
virtual void DoActionFromAtoB()override;
virtual void DoActionFromBtoA()override;
};
void testMediator();
源文件
#include "Mediator.h"
ConCreateColleagueA::ConCreateColleagueA(Mediator*m)
{
this->_mediator = m;
}
void ConCreateColleagueA::Action()
{
this->_mediator->DoActionFromAtoB();
}
void ConCreateColleagueA::Sync()
{
cout << __FUNCTION__ << endl;
}
ConCreateColleagueB::ConCreateColleagueB(Mediator*m)
{
this->_mediator = m;
}
void ConCreateColleagueB::Action()
{
this->_mediator->DoActionFromBtoA();
}
void ConCreateColleagueB::Sync()
{
cout << __FUNCTION__ << endl;
}
void ConCreateMediator::IntroColleague(Colleague*a, Colleague *b)
{
this->colleague_A = a;
this->colleague_B = b;
}
void ConCreateMediator::DoActionFromAtoB()
{
colleague_B->Sync();
}
void ConCreateMediator::DoActionFromBtoA()
{
colleague_A->Sync();
}
void testMediator()
{
ConCreateMediator* mediator = new ConCreateMediator;
ConCreateColleagueA *a = new ConCreateColleagueA(mediator);
ConCreateColleagueB *b = new ConCreateColleagueB(mediator);
mediator->IntroColleague(a, b);
a->Action();
b->Action();
a->Action();
}