被说了很多遍的设计模式---中介者模式

来源:互联网 发布:手机屏幕写字的软件 编辑:程序博客网 时间:2024/05/02 20:23

[把你的理性思维慢慢变成条件反射]

本文,我们讲介绍中介者模式,文章主题结构与上文一致。惯例,先来看看我们示例工程的环境:

操作系统:win7 x64

其他软件:eclipse mars,jdk8

-------------------------------------------------------------------------------------------------------------------------------------

经典问题:

消息总线,第三方中介服务等。

思路分析:

要点一:两个对象之间的调用关系,不直接发生任何作用。

要点二:新对象的接入不能对原有对象,产生过多影响。

示例工程:


模板代码:

创建Colleague.java文件,具体内容如下:

package com.yonyou.iuap.gof_Mediator;public abstract class Colleague {protected Mediator mediator;public Colleague(Mediator mediator){this.mediator = mediator;}}
创建ConcreteColleague1.java,ConcreteColleague2.java文件,具体内容如下:

package com.yonyou.iuap.gof_Mediator;public class ConcreteColleague1 extends Colleague {public ConcreteColleague1(Mediator mediator) {super(mediator);}public void notifya(String message) {// TODO Auto-generated method stubSystem.out.println("c1:"+message);}public void send(String message){mediator.send(message, this);}}
创建ConcreteMediator.java文件,具体内容如下:

package com.yonyou.iuap.gof_Mediator;public class ConcreteMediator extends Mediator {private ConcreteColleague1 colleague1;private ConcreteColleague2 colleague2;public ConcreteColleague1 getColleague1() {return colleague1;}public void setColleague1(ConcreteColleague1 colleague1) {this.colleague1 = colleague1;}public ConcreteColleague2 getColleague2() {return colleague2;}public void setColleague2(ConcreteColleague2 colleague2) {this.colleague2 = colleague2;}@Overridepublic void send(String message, Colleague colleague) {if(colleague.equals(colleague1)){colleague2.notifya(message);}else{colleague1.notifya(message);}}}
创建Mediator.java文件,具体内容如下:
package com.yonyou.iuap.gof_Mediator;public abstract class Mediator {public abstract void send(String message,Colleague colleague);}
创建Window.java文件,具体内容如下:

package com.yonyou.iuap.gof_Mediator;public class Window {public static void main(String[] args) {ConcreteMediator m = new ConcreteMediator();ConcreteColleague1 c1 = new ConcreteColleague1(m);ConcreteColleague2 c2 = new ConcreteColleague2(m);m.setColleague1(c1);m.setColleague2(c2);c1.send("a msg come from c1 ");c2.send("a msg come from c2");}}
【上面的代码直接看的话,可能有难度。先把代码提供给各位看官是希望现将代码运行起来,观察结果。下面我们介绍相关的概念与原理】

模式总结:

中介者模式结构图:


中介者模式:

用一个中介对象来封装一系列的对象交互。中介者使个对象不需要显示地相互调用,从而使其耦合松散,而且可以独立地改变他们之间的相互作用。

组成部分:

  • Mediator(抽象中介者):它定义一个接口,该接口用于与各个Colleague对象之间进行通信。
  • ConcreteMediator(具体中介者):它是Mediator抽象中介者的子类,通过协调各个同事对象来实现协作行为,它维持了对各个Colleague对象的引用。
  • Colleague(抽象同事类):定义各个Colleague公共的方法,声明了一些抽象方法来供子类实现,同事维持了一个对Mediator的引用,其子类可以通过该引用来与中介者进行通信。
  • ConcreteColleague(具体同事类):它是Colleague的子类,每一个Colleague对象在需要和其他Colleague对象通信时,先与Mediator进行通信,通过Mediator来简介完成与其他Colleague类的通信,在ConcreteColleague中实现了在Colleague中声明的抽象方法。

特别说明:

在中介者模式中,中介者承担了两个主要功能:

(1)中转调用:将直接的交换关系变为松耦合的调用关系。

         如下图:中介者模式将网状的调用关系变为了星型的调用关系。

+++++>

(2)封装调用接口:所有Colleague可以使用一致的接口进行调用。

反思:

应用场景:

  1. 系统中存在一组对象定义良好,但是存在多对多的复杂调用关系时,可以考虑使用中介者模式。
  2. 单个对象调用了多个对象,导致该对象结构混乱不能复用。
  3. 想通过中介者的封装形式代替多个被调用对象通过继承关系实现某个过程时。

优点:

  1. 简化了对象之间的交互方式。
  2. 统一了各个对象之间的调用接口。
  3. 有效的降低了各个对象之间的耦合度。提高了代码可维护性,扩展性。
  4. 通过封装代替继承,减少了子类数量,提高了代码复用度。

缺点:

  1. 当中介者模式中包含了大量Colleague之间的交互细节时,可能导致中介者类非常复杂。并且,如果需要实现类似消息总结这样的功能时,也需要精心设计其实现过程。

-------------------------------------------------------------------------------------------------------------------------------------

至此,被说了很多遍的设计模式---中介者模式 结束


特别备注:本文我们减少了一些组件的代码说明,是因为,中介者模式的功能常见于消息总线,但实际应用中,几乎很少需要单独实现该模式,因此,上文仅作为说明示例,以备后续开中使用。


参考资料:

图书:《大话设计模式》

其他博文:http://blog.csdn.NET/lovelion/article/details/7563445


0 0