今天,我们来学习下中介者模式,所谓中介者模式,就是充当一个中间人的角色,让两种不同领域的人沟通;把这句话转换为软件角色就是让有交集的两个类变得没有任何关系。没有关系就表明了两个类之间的耦合度为零,这就是我们需要的最终奥义,也是中介者模式要达到的目的。
首先第一步,抽象一个中介者,这个中介者就干一件事,传递信息,所以,代码如下
abstract class Mediator { public abstract void Send(string message, Colleague colleague); }
Mediator类就是我们抽象的一个中介者类,它有一个Send方法,方法参数有两个,一个message和一个Colleague,我们想一下,一个中介者是如何传递消息的,首先,它得到一个需要传递消息的人,然后把这个人的消息传递给更多的人,所以,这里的Colleague类型就是我们抽象出来的人的类
abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; } }
上面就是我们抽象的Colleague类,人当然需要中介者才能完成它想要完成的任务,所以,这里就是通过构造函数注入的方式获取一个中介者。好了,所有的抽象都已完成,接下来我们就来实现他们吧
首先,我们先实现两个同事类吧
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); } }
ConcreteColleague1类和ConcreteColleague2类就是我们实现的同事类,他们都继承Colleague类,到了这里可能会有点蒙,我们来梳理一下,首先是Send方法,这里是在做什么事呢?我们看到它的内部是调用了Send方法,这个Send方法就是我们抽象的中介者的Send方法,然后把消息和自身传递给中介者,供中介者使用,然后Notify方法就是输入自身的交互信息。接下来,我们要实现中介者抽象了,我们需要一个具体的中介者来帮忙做事。
class ConcreteMediator : Mediator { private ConcreteColleague1 concrete1; private ConcreteColleague2 concrete2; public ConcreteColleague1 Colleague1 { set { concrete1 = value; } } public ConcreteColleague2 Colleague2 { set { concrete2 = value; } } public override void Send(string message, Colleague colleague) { if (colleague == concrete2) concrete2.Notify(message); else concrete1.Notify(message); } }
我们可以看到,ConcreteMediator类中有两个属性和一个方法,根据我们生活的常识来说,一个具体的中介者,是不是需要认识双发需要交流的人,所以这里我们也需要获取ConcreteColleague1和ConcreteColleague2,然后重写父类Mediator的Send方法,到这里我们的中介者模式所以骨架就都完成了,接下来,让我们来看看如何使用它。
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("没有呢,你打算请客?"); Console.Read(); } }
首先,第一步,我们先new一个中介者出来,然后再new两位同事出来,我们new出来的这两位同事肯定是要和中介者认识啊(所以new需要一个中介者对象m),然后他们都会各自去找我们的中介者(把自身对象传递给中介者),最后,他们就可以发送消息通信了,我们看运行结果
本来两个不相干的类,通过中介者模式可以实现交互,这是多么的神奇啊是吧。
官方说明中介者模式概述:可以把系统的网状结构变成以中介者为中心的星型结构。这样转变的好处就是保证了对象结构上的稳定,系统的结构不会因为引入新对象而带来大量的修改工作。