定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用
类图如下

Mediator
public abstract class Mediator
{
public abstract void Register(Colleague colleague);
public abstract void Relay(Colleague colleague);
}
ConcreteMediator
public class ConcreteMediator : Mediator
{
private List<Colleague> colleagues = new List<Colleague>();
public override void Register(Colleague colleague)
{
if(!this.colleagues.Contains(colleague))
{
this.colleagues.Add(colleague);
colleague.SetMediator(this);
}
}
public override void Relay(Colleague colleague)
{
foreach (var item in this.colleagues.Where(p => p!= colleague))
{
item.Receive();
}
}
}
Colleague
public abstract class Colleague
{
protected Mediator mediator;
public void SetMediator(Mediator mediator)
{
this.mediator = mediator;
}
public abstract void Send();
public abstract void Receive();
}
ColleageA
public class ColleageA : Colleague
{
public override void Receive()
{
Console.WriteLine("Receive in ColleageA");
}
public override void Send()
{
this.mediator.Relay(this);
}
}
ColleageB
public class ColleageB:Colleague
{
public override void Send()
{
this.mediator.Relay(this);
}
public override void Receive()
{
Console.WriteLine("Receive in ColleageB");
}
}
调用
···
static void Main(string[] args)
{
var mediator = new ConcreteMediator();
ColleageA colleageA = new ColleageA();
ColleageB colleageB = new ColleageB();
mediator.Register(colleageA);
mediator.Register(colleageB);
colleageA.Send();
}
···
优点:
- 降低了对象的耦合,使同事类之间不在相互依赖,符合单一职责
缺点:
- 当同事类比较多时,中介类职责会变得越来越庞大
源代码地址: 点击我下载 提取码: x284