结构
参与者
Mediator(中介者)
——中介者定义一个接口用于与个同事(Colleague)对象通信。
ConcreteMediator(具体中介者 )
——具体中介者通过协调各同事对象实现协作行为。——了解并维护它的各个同事。
Colleague class(同事类)——每一个同事类都知道它的中介者对象。
——每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
参考代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMediator
{
abstract class Mediator
{
public abstract void Send(string message, Colleague colleague);
}
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);
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMediator
{
abstract class Colleague
{
protected Mediator mediator;
public Colleague(Mediator mediator)
{
this.mediator = mediator;
}
}
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);
}
}
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);
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMediator
{
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("Things can only get better!");
c2.Send("Yes, all is well!");
Console.Read();
}
}
}
效果
1)将各Colleague解耦
Mediator有利于各Colleague间的松耦合。你可以独立的改变和复用各Colleague类和Mediator类。
2) 它简化了对象协议
用Mediator和各Colleague间的一对多的交互来代替多对多的交互。一对多的关系更易于理解、维护和扩展。
3)它对对象如何协作进行了抽象
将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的。(从更宏观的角度去看待系统)
4) 它使控制集中化
中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议,它可能变得比任一个Colleague都复杂。这可能使得中介者自身成为一个难于维护的庞然大物。
实现
注意Colleague与Mediator之间的通信。
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要调用另个一类的某一个方法的话,可以通过第三者转发这个调用。
(可以参考观察者模式,对比学习)