名称:中介者模式
意图:用一个中介对象封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
适用环境:
1、一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
2、一个对象引用其他很多对象并且直接与这些对象通信,导致难惟复用该对象。
3、想定制一个分布在多个类中的行为,而又不想生成太多的子类。
abstractclassMediator
{
publicabstractvoidSend(stringmessages,
Colleaguecolleague);
}
classConcreteMediator: Mediator
{
privateConcreteColleague1_colleague1;
privateConcreteColleague2_colleague2;
publicConcreteColleague1Colleague1
{
set{ _colleague1 = value; }
}
publicConcreteColleague2Colleague2
{
set{ _colleague2 = value; }
}
publicoverridevoidSend(stringmessage,
Colleaguecolleague)
{
if(colleague == _colleague1)
{
_colleague2.Notify(message);
}
else
{
_colleague1.Notify(message);
}
}
}
abstractclassColleague
{
protectedMediatormediator;
publicColleague(Mediatormediator)
{
this.mediator = mediator;
}
}
classConcreteColleague1: Colleague
{
publicConcreteColleague1(Mediatormediator)
: base(mediator)
{
}
publicvoidSend(stringmessage)
{
mediator.Send(message, this);
}
publicvoidNotify(stringmessage)
{
Console.WriteLine("Colleague1 gets message:"
+ message);
}
}
classConcreteColleague2: Colleague
{
publicConcreteColleague2(Mediatormediator)
: base(mediator)
{
}
publicvoidSend(stringmessage)
{
mediator.Send(message, this);
}
publicvoidNotify(stringmessage)
{
Console.WriteLine("Colleague2 gets message:"
+ message);
}
}
调用:
ConcreteMediatorm = newConcreteMediator();
ConcreteColleague1cc1 = newConcreteColleague1(m);
ConcreteColleague2cc2 = newConcreteColleague2(m);
m.Colleague1 = cc1;
m.Colleague2 = cc2;
cc1.Send("How are You?");
cc2.Send("Fine, thanks");
输出:
Colleague2 gets message:How are You?
Colleague1 gets message:Fine, thanks