讲解:用一个中介者对象来封装一系列的对象交互。中介者使得各对象不需要显式地相互引用,从而使其松散耦合,而且可以独立地改变它们之间的交互
官方demo如下
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace StrategyMo.zhongjie { /// <summary> /// 中介类 /// </summary> public abstract class Mediator { public abstract void Send(string message, Colleague colleague); } public abstract class Colleague { protected Mediator mediator; public Colleague(Mediator m) { this.mediator = m; } } public class ConcreteMediator : Mediator { private ConcreteColleague1 c1; public ConcreteColleague1 C1 { set { c1=value; } } private ConcreteColleague2 c2; public ConcreteColleague2 C2 { set { c2 = value; } } public override void Send(string message, Colleague colleague) { if (colleague == c1) { c2.Notify(message); } else { c1.Notify(message); } } } public 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); } } public 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); } } }
客户端:
ConcreteMediator cm=new ConcreteMediator(); ConcreteColleague1 cc1 = new ConcreteColleague1(cm); ConcreteColleague2 cc2 = new ConcreteColleague2(cm); cm.C1 = cc1; cm.C2 = cc2; cc1.Send("你好c1"); cc2.Send("hi,你也好c2");
缺点:
你会在程序中增加一个巨大的对象,而你的噩梦就是维护这个对象。 中介者里面会包含大量的逻辑,设计较多的节点获取,造成的维护难度也是显而易见的。所以,还是那句话,不要为了模式而模式,这个世界上没有万能的模式,就和没有绝对安全的系统一样。
由于Mediator是中介,所以可以有多个中介,如果以卖方为例子
房产中介就是Mediator,他们公共的方法可以是 ,打电话联系客户 CallCustomer, Sold卖房子。Buy买房子
房主和我们普通人是不认识的,我们可以通过中介与房主得到联系, 比如我 要Buy,通过中介,找到合适的卖家,让你可以间接的与卖家联系上了。这就是中介模式。主要调节对象与对象之间的关系。
前面学过适配器模式: 适配器是为了维护兼容老方法,对外提供老接口。
而代理模式:就是 卖房子和房主 是继承统一接口,两个人一模一样,只是中间做个中转,没有额外处理。你调用中介,等于调用房主的方法。
而外观模式:内部封装一组组 方法的组合。