中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
这个模式我们可以简单的类比于星型结构,中介者就是中心,其他对象的交互都是通过中心的中介者作为媒介,而不是直接交互,这样就避免了对象直接交互导致的关系混乱,不易维护的缺点。
UML图如下:
//抽象中介者类
abstract class Mediator
{
public abstract void Send(string message,Colleague colleague)
}
//抽象同事类
abstract class Colleague
{
protected Mediator mediator;
public Colleauge(Mediator mediator)
{
this.mediator = mediator;
}
}
//具体中介者类
class ConcreteMediator : Mediator
{
public ConcreteColleauge1 colleague1;
public ConcreteColleauge2 colleague2;
public override void Send(string message, Colleague colleague)
{
if(colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
//具体同事类 ConcreteColleague2类似
class ConcreteColleague1 : Colleague
{
public ConcreteColleague1(Mediator mediator):base(mediator){}
public void Send(string message)
{
mediator.Send(message);
}
public void Notify(string message)
{
Print("同事1收到消息");
}
}
//测试
static void Main(string[]args)
{
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 c1 = new ConcreteColleague1();
ConcreteColleague2 c2 = new ConcreteColleague2();
mediator.colleague1 = c1;
mediator.colleague2 = c2;
//发送消息,其实都是通过mediator对象发送的
c1.Send("第一则消息");
c2.Send("第二则消息");
Console.Read();
}
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及向定制一个分布在多个类中的行为,而又不想生成太多子类的场合。
中介者模式的主要优点在于简化了对象之间的交互,将各同事解耦,还可以减少子类生成,对于复杂的对象之间的交互,通过引入中介者,可以简化各同事类的设计和实现。
中介者模式主要缺点在于具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
参考书籍:《大话设计模式》