中介者模式用一个中介对象封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可独立改变它们之间的交互。
如果具体中介者维护的具体的对象繁多时,维护可能比较麻烦。
代码如下:
class Colleague
{
protected:
Mediator *m_pMediator;
public:
Colleague( Mediator* __m )
{
if ( __m != NULL )
{
m_pMediator = __m;
}
}
~Colleague(){}
};
class ColleagueOne : public Colleague
{
public:
ColleagueOne( Mediator* __m):Colleague( __m ){}
~ColleagueOne(){}
void Send( string& strMessage )
{
m_pMediator->Send(strMessage,this);
}
void Notify( string& strMessage )
{
printf("ColleagueOne get information:%s\n", strMessage.c_str() );
}
};
class ColleagueTwo : public Colleague
{
public:
ColleagueTwo( Mediator* __m):Colleague( __m ){}
~ColleagueTwo(){}
void Send( string& strMessage )
{
m_pMediator->Send(strMessage,this);
}
void Notify( string& strMessage )
{
printf("ColleagueTwo get information:%s\n", strMessage.c_str() );
}
};
class Mediator
{
public:
virtual void Send( string &message, Colleague * pCol ){};
};
class ConcreteMediator: public Mediator
{
private:
ColleagueOne * m_pColOne;
ColleagueTwo * m_pColTwo;
public:
void SetColleagueOne(ColleagueOne* pColOne)
{
if ( pColOne != NULL )
{
m_pColOne = pColOne ;
}
}
void SetColleagueTwo(ColleagueTwo* pColTwo)
{
if ( pColTwo != NULL )
{
m_pColTwo = pColTwo ;
}
}
virtual void Send( string &message, Colleague * pCol )
{
if ( pCol == m_pColOne )
{
m_pColTwo->Notify( message );
}
else
{
m_pColOne->Notify( message );
}
}
};
//客户端代码
int main( )
{
ConcreteMediator *pMediator = new ConcreteMediator();
ColleagueOne* pColOne = new ColleagueOne( pMediator );
ColleagueTwo* pColTwo = new ColleagueTwo( pMediator );
pMediator->SetColleagueOne(pColOne );
pMediator->SetColleagueTwo(pColTwo );
pColOne->Send(string("Have lunch?"));
pColTwo->Send(string("Not yet. Is it your pleaure?") );
if ( pMediator )
{
delete pMediator ;
pMediator = NULL ;
}
if ( pColOne )
{
delete pColOne ;
pColOne = NULL ;
}
if ( pColTwo )
{
delete pColTwo ;
pColTwo = NULL ;
}
return 0;
}
运行结果如下: