对象之间的交互是一种非常普遍的需求。当系统规模较大、对象数量众多时,相互通信的复杂度会急剧上升。为了管理这种复杂性,需要引入一个专门负责协调交互的通信类,这正是 Mediator(中介者)模式的核心思想,它同时也带来了系统间对象的松耦合。
Mediator 模式的价值在于:它将对象间的通信封装到一个独立的类中,把原本的多对多通信关系转换为一对多,从而显著降低了通信的复杂性。借助 Mediator,各个 Colleague 无需直接维护彼此的通信对象和协议,系统耦合度大幅下降,Mediator 与 Colleague 也可以相互独立地演进和修改。
此外,Mediator 模式还具备集中控制的特点,便于统一管理,也符合面向对象设计中每个类单一职责的原则。
示例代码
头文件
#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();
}