这篇文章距离最后更新已过26 天,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
定义
- 用一个中介对象来封装一系列的对象交互。中介者可以使对象不需要显式地相互引用,从而使其耦合分散,而且可以独立地改变它们之间的交互。
- 简单来说就是将 对象与对象之间的交互,改为 对象与中介间交互。交互的细节有中介承担。
使用场景
- 各国之间的贸易,改为各国通过WTO来互相贸易
- MVC框架,控制器作为中介调节 视图 和 模型
- 聊天室,聊天者 与 聊天室的关系
- 现实世界的中介
- 多个类互相耦合,形成网状结构。这时可以考虑使用中介模式,中介者一般用于定义良好的但是以复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为,而又不想生成太多子类的场合。
代码实现
//抽象中介类
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);
}
}
}
//具体同事类
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得到消息:{0}", message);
}
}
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得到消息:{0}", message);
}
}
void Main()
{
ConcreteMediator m = new ConcreteMediator(); //中介者对象
ConcreteColleague1 c1 = new ConcreteColleague1(m); // 让同事认识中介
ConcreteColleague2 c2 = new ConcreteColleague2(m);
m.Colleague1 = c1; //让中介认识同事
m.Colleague2 = c2;
c1.Send("你好,我是c1");
c2.Send("你好,我是c2");
}
优点缺点
- 降低了类的复杂度,将一对多转化为一对一
- 各类间的解耦
- 符合迪米特原则(只与自己认识的人通信)
- 中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。新增加一个同事类时,不得不去修改抽象中介者类和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。
- 当系统出现多对多交互复杂的对象群时,不要先考虑使用中介者模式,应该先考虑系统设计上是否合理。由于具体中介类控制集中化,交互的复杂性变为中介者的复杂性,这就使得中介类比任何一个和它交互的类复杂。