定义
用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
举例
例如常见的qq群文件,用户将文件上传到QQ群,其他用户可以QQ群上下载文件。QQ群就是中介者
或者像联合国,各国围绕联合国,联合国就是中介者
结构
实现
//定义一个抽象的发送消息方法,得到同事对象和发送信息
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 ConcreteColleague1 colleague1;
private ConcreteColleague2 colleague2;
//需要了解所有的具体同事对象
public ConcreteColleague1 Colleague1
{
set { colleague1 = value; }
}
public ConcreteColleague2 Colleague2
{
set { Colleague2 = value; }
}
public override void Send(string message, Colleague colleague)
{
//重写发送信息的方法,根据对象做出选择判断,通知对象
if (colleague == colleague1)
{
colleague2.Notify(message);
}
else
{
colleague1.Notify(message);
}
}
}
//同事1对象
class ConcreteColleague1: Colleague
{
public ConcreteColleague1(Mediator mediator):base(mediator)
{
}
//发送信息时通常是中介者发送出去的
public void Send(string message)
{
mediator.Send(message, this);
}
public void Notify(string message)
{
Console.WriteLine("同事1得到信息: " + message);
}
}
//同事2对象
class ConcreteColleague2: Colleague
{
public ConcreteColleague2(Mediator mediator) : base(mediator)
{
}
public void Send(string message)
{
mediator.Send(message, this);
}
public void Notify(string message)
{
Console.WriteLine("同事2得到信息: " + message);
}
}
class Program
{
static void Main(string[] args)
{
ConcreteMediator m = new ConcreteMediator();
//让两个具体同事类认识中介者对象
ConcreteColleague1 c1 = new ConcreteColleague1(m);
ConcreteColleague2 c2 = new ConcreteColleague2(m);
//让中介者认识各个具体同事类
m.Colleague1 = c1;
m.Colleague2 = c2;
//具体同事类对象的发送信息都是通过中介者转发
c1.Send("吃过饭了吗?");
c2.Send("没有呢,你打算请客?");
}
}
优点
- (1)中介者模式简化了对象之间的交互,它用中介者和同事的对多交互代替了原来同事之间的多对多交互,一对多关系更容易理解、维护和扩展,将原本难以理解的网状结构转换成相对简单的星形结构。
- (2)可将各同事对象解耦,中介者模式有利于各同事之间的松耦合,可以独立地改变和复用每一个同事和中介者,增加新的中介者类和新的同事类都比较方便,更好地符合开闭原则。
- (3)可以减少子类的生成,中介者模式将原本分布于多个对象间的行为集中在一起,改变这些行为只需生成新的中介者子类即可,这使得各个同事类可被重用,无须直接对同事类进行扩展。
缺点
在具体中介者类中包含了大量的同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
适用环境
- (1)系统中对象之间存在着复杂的引用关系,系统结构混乱且难以理解。
- (2)一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
- (3)用户想通过一个中间类来封装多个类中的行为,又不想生成太多的子类,此时可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的具体中介者类。