Loading... # 设计模式(二十二)——中介者模式 ## 参考 > 大话设计模式  ——  程杰 著 ## 目录 [设计模式(一)——简单工厂模式](https://www.princelei.club/archives/67.html) [设计模式(二)——策略模式](https://www.princelei.club/archives/68.html) [设计模式(三)——设计原则](https://www.princelei.club/archives/116.html) [设计模式(四)——装饰模式](https://www.princelei.club/archives/117.html) [设计模式(五)——代理模式](https://www.princelei.club/archives/119.html) [设计模式(六)——工厂方法模式](https://www.princelei.club/archives/132.html) [设计模式(七)——原型模式](https://www.princelei.club/archives/133.html) [设计模式(八)——模板方法模式](https://www.princelei.club/archives/134.html) [设计模式(九)——外观模式](https://www.princelei.club/archives/135.html) [设计模式(十)——建造者模式](https://www.princelei.club/archives/136.html) [设计模式(十一)——观察者模式](https://www.princelei.club/archives/137.html) [设计模式(十二)——抽象工厂模式](https://www.princelei.club/archives/138.html) [设计模式(十三)——状态模式](https://www.princelei.club/archives/139.html) [设计模式(十四)——适配器模式](https://www.princelei.club/archives/140.html) [设计模式(十五)——备忘录模式](https://www.princelei.club/archives/141.html) [设计模式(十六)——组合模式](https://www.princelei.club/archives/147.html) [设计模式(十七)——迭代器模式](https://www.princelei.club/archives/148.html) [设计模式(十八)——单例模式](https://www.princelei.club/archives/157.html) [设计模式(十九)——桥接模式](https://www.princelei.club/archives/159.html) [设计模式(二十)——命令模式](https://www.princelei.club/archives/160.html) [设计模式(二十一)——职责链模式](https://www.princelei.club/archives/161.html) [设计模式(二十二)——中介者模式](https://www.princelei.club/archives/162.html) [设计模式(二十三)——享元模式](https://www.princelei.club/archives/163.html) [设计模式(二十四)——解释器模式](https://www.princelei.club/archives/173.html) [设计模式(二十五)——访问者模式](https://www.princelei.club/archives/174.html) ## 何为中介者模式 - 中介者模式(Mediator),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 ## 中介者模式解决的问题   尽管将一个系统分割成许多对象通常可以增加其可复用性,但是对象间相互连接的激增又会降低其可复用性了。大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。   ‘迪米特法则’告诉我们,如果两个类不必彼此直接通信,那么这两个类就不应该发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。 ## 示例 美国和伊拉克之间的对话都是通过联合国安理会作为中介来完成 Mediator类 ``` /** * 联合国机构 */ public interface UnitedNations { void declare(String message,Country colleague); } ``` Colleague类 ``` /** * 国家类 */ public abstract class Country { protected UnitedNations mediator; public Country(UnitedNations mediator) { this.mediator = mediator; } //声明 public void declare(String message){ mediator.declare(message,this); } //获得消息 public abstract void getMessage(String message); } ``` ConcreteColleague1类 ``` /** * 美国 */ public class USA extends Country { public USA(UnitedNations mediator) { super(mediator); } @Override public void getMessage(String message) { System.out.println("美国获得对方信息:" + message); } } ``` ConcreteColleague2类 ``` /** * 伊拉克 */ public class Iraq extends Country { public Iraq(UnitedNations mediator) { super(mediator); } @Override public void getMessage(String message) { System.out.println("伊拉克获得对方信息:" + message); } } ``` ConcreteMediator类 ``` /** * 联合国安全理事会 */ public class UnitedNationsSecurityCouncil implements UnitedNations { private USA colleague1; private Iraq colleague2; public USA getColleague1() { return colleague1; } public void setColleague1(USA colleague1) { this.colleague1 = colleague1; } public Iraq getColleague2() { return colleague2; } public void setColleague2(Iraq colleague2) { this.colleague2 = colleague2; } //声明 @Override public void declare(String message, Country colleague) { if (colleague == colleague1) { colleague2.getMessage(message); } else { colleague1.getMessage(message); } } } ``` ``` /** * 客户端 */ public class MainClass { public static void main(String[] args) { UnitedNationsSecurityCouncil unsc = new UnitedNationsSecurityCouncil(); USA c1 = new USA(unsc); Iraq c2 = new Iraq(unsc); unsc.setColleague1(c1); unsc.setColleague2(c2); c1.declare("不准研制核武器,否则要发动战争!"); c2.declare("我们没有核武器,也不怕侵略。"); } } ``` 输出: ``` 伊拉克获得对方信息:不准研制核武器,否则要发动战争! 美国获得对方信息:我们没有核武器,也不怕侵略。 ``` ## 中介者模式优缺点   中介者模式很容易在系统中应用,也很容易在系统中误用。当系统出现了‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。   中介者模式的优点首先是Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator。其次,由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。   缺点是,由于ConcreteMediator控制了集中化,于是就把交互复杂性变为了中介者的复杂性,这就使得中介者会变得比任何一个ConcreteColleague都复杂。 ## 何时使用中介者模式   中介者模式一般应用于一组对象以定义良好但是复杂的方式进行通信的场合,如:窗体Form对象或Web页面aspx,以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。 Last modification:November 27th, 2020 at 06:14 pm © 允许规范转载