今天我们来讲一下中介者模式。
什么叫中介者模式呢?中介者模式,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显示的相互引用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
我们拿两个不认识的同事通过第三人打招呼这个情景,来看一下中介者模式是什么样的:
//抽象中介者类
abstract class Mediator
{
//定义一个抽象的发送消息方法,得到同时对象和发送消息
public abstract void Send(string message, Colleague colleague);
}
abstract class Colleague
{
protected Mediator mediator;
//构造方法,得到中介者对象
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
}
//具体的中介者类
class ConcreteMediator:Mediator
{
//需要了解所有的具体同事类对象
private ConcreateColleague1 colleague1;
private ConcreateColleague2 colleague2;
internal ConcreateColleague1 Colleague1
{
set
{
colleague1 = value;
}
}
internal ConcreateColleague2 Colleague2
{
set
{
colleague2 = value;
}
}
//重写发送信息的方法,根据对象做出选择判断,通知对象
public override void Send(string message, Colleague colleague)
{
if (colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
//具体的同事类1
class ConcreateColleague1:Colleague
{
public ConcreateColleague1(Mediator mediator) : base(mediator)
{
}
//发送消息时通常使中介者发送出去的。
public void Send(string message)
{
mediator.Send(message, this);
}
public void Notify(string message)
{
Console.WriteLine($"同事1得到消息{message}");
}
}
class ConcreateColleague2:Colleague
{
public ConcreateColleague2(Mediator mediator) : base(mediator)
{
}
public void Send(string message)
{
mediator.Send(message, this);
}
public void Notify(string message)
{
Console.WriteLine($"同事2得到消息{message}");
}
}
客户端调用
public static void Main()
{
ConcreteMediator m = new ConcreteMediator();
//让两个具体同事类认识中介者对象
ConcreateColleague1 c1 = new ConcreateColleague1(m);
ConcreateColleague2 c2 = new ConcreateColleague2(m);
//让中介者认识各个具体同事类对象
m.Colleague1 = c1;
m.Colleague2 = c2;
//具体同事类对象的发送信息都使通过中介者转发
c1.Send("吃饭了吗?");
c2.Send("还没有呢,你打算请客吗?");
Console.ReadKey();
}
中介者模式很容易再系统中应用,也很容易再系统中误用。当系统出现‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计商是不是合理。
由于把对象如何协同进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。
好,中介者模式今天我们就讲到这里,下一篇我们讲 享元模式