对象之间的交互是一种非常普遍的需求。当系统规模较大、对象数量众多时,相互通信的复杂度会急剧上升。为了管理这种复杂性,需要引入一个专门负责协调交互的通信类,这正是 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();
                
                
                
                }