中介者模式(Mediator)(调停者模式),用一个中介对象来封装一系列的对象交互。中介者使各个对象不须要显式地相互引用,从而使其耦合松散,并且能够独立的改变它们之间的交互。c#
主要解决:对象与对象之间存在大量的关联关系,这样势必会致使系统的结构变得很复杂,同时若一个对象发生改变,咱们也须要跟踪与之相关联的对象,同时作出相应的处理。
什么时候使用:多个类相互耦合,造成了网状结构。
如何解决:将上述网状结构分离为星型结构。安全
例:框架
中介者模式UML结构图:ide
例:
MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
窗体的Form对象(每一个控件之间的通讯都是依靠Form对象完成的(经过事件机制进行通讯)(事件机制的执行是在Form对象中完成的),这样使得每一个控件内部没必要关注与其余控件的通讯,下降了耦合度)或者Web界面aspx,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。this
优势: 一、下降了类的复杂度,将一对多转化成了一对一。 二、各个类之间的解耦。 三、符合迪米特原则。
缺点:中介者会庞大,变得复杂难以维护。code
外观(门面)模式与中介者模式的区别:orm
外观(门面)模式关注的是这组复杂对象如何与外界通讯对象
中介者模式关注的是这组复杂对象之间的内部通讯事件
观察者模式与中介者模式的联系:ci
能够组合使用,来实现当同事对象发生改变的时候,通知中介者对象,让中介者对象去进行其余相关对象的交互。
例(联合国与和平):
//联合国机构 abstract class UnitedNations { /// <summary> /// 声明 /// </summary> /// <param name="message">声明信息</param> /// <param name="colleague">声明国家</param> public abstract void Declare(string message, Country colleague); } //联合国安全理事会 class UnitedNationsSecurityCouncil : UnitedNations { private USA colleague1; private Iraq colleague2; public USA Colleague1 { set { colleague1 = value; } } public Iraq Colleague2 { set { colleague2 = value; } } public override void Declare(string message, Country colleague) { if (colleague == colleague1) { colleague2.GetMessage(message); } else { colleague1.GetMessage(message); } } } //国家 abstract class Country { protected UnitedNations mediator; public Country(UnitedNations mediator) { this.mediator = mediator; } } //美国 class USA : Country { public USA(UnitedNations mediator) : base(mediator) { } //声明 public void Declare(string message) { mediator.Declare(message, this); } //得到消息 public void GetMessage(string message) { Console.WriteLine("美国得到对方信息:" + message); } } //伊拉克 class Iraq : Country { public Iraq(UnitedNations mediator) : base(mediator) { } //声明 public void Declare(string message) { mediator.Declare(message, this); } //得到消息 public void GetMessage(string message) { Console.WriteLine("伊拉克得到对方信息:" + message); } } class Program { static void Main(string[] args) { UnitedNationsSecurityCouncil UNSC = new UnitedNationsSecurityCouncil(); USA c1 = new USA(UNSC); Iraq c2 = new Iraq(UNSC); UNSC.Colleague1 = c1; UNSC.Colleague2 = c2; c1.Declare("不许研制核武器,不然要发动战争!"); c2.Declare("咱们没有核武器,也不怕侵略。"); Console.Read(); } }