结构
参与者
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都复杂。这可能使得中介者自身成为一个难于维护的庞然大物。
中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。
迪米特法则:如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要调用另个一类的某一个方法的话,可以通过第三者转发这个调用。
(可以参考观察者模式,对比学习)