在阎宏博士的《JAVA与模式》一书中开头是这样描述调停者(Mediator)模式的:
调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松 散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
什么是调停者
在调停者模式中,所以的成员对象都是可以协调工作,但是又不直接相互管理。这些对象都与一个处于中心位置地位的调停者对象发生紧密的关系。有这个调停者对象进行协调工作。
如下图所示,这个示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同 事(Colleague)对象。这些同事对象通过彼此的相互作用形成系统的行为。从图中可以看出,几乎每一个对象都需要与其他的对象发生相互作用,而这种 相互作用表现为一个对象与另一个对象的直接耦合。这就是过度耦合的系统。
通过引入调停者对象(Mediator),可以将系统的网状结构变成以中介者为中心的星形结构,如下图所示。在这个星形结构中,同事对象不再通过直接的联 系与另一个对象发生相互作用;相反的,它通过调停者对象与另一个对象发生相互作用。调停者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因 为新对象的引入造成大量的修改工作。
一个好的面向对象的设计可以使对象之间增加协作性(Collaboration),减少耦合度(Couping)。一个深思熟虑的设计会把一个系统分解为一群相互协作的同事对象,然后给每一个同事对象以独特的责任,恰当的配置它们之间的协作关系,使它们可以在一起工作。
类同如下
源代码如下
package com.jerry.pattern.mediator; /*** * 调停者模式 * * * 2013-3-14 */ public class Client { /** 调停者 */ private static ConcreteMediator mediator; private static Colleague c1, c2, c3; public static void main(String[] args) { mediator = new ConcreteMediator(); mediator.createConcreteMediator(); c1 = new Colleague1(mediator); c2 = new Colleague2(mediator); c3 = new Colleague2(mediator); mediator.colleagueChanged(c1); mediator.colleagueChanged(c2); mediator.colleagueChanged(c3); } }
package com.jerry.pattern.mediator; /** * 抽象同事角色 每个同事对象 仅知道调停者 而不知道其他同事对象 */ public abstract class Colleague { private Mediator mediator; public Colleague(Mediator m) { mediator = m; } /** * 当前同时对象发生变化时,通知调停者 */ public void change() { mediator.colleagueChanged(this); } /** * 行动方法,一个同事对象在得知其他同事对象有变化时 会执行此方法 */ public abstract void action(); public Mediator getMediator() { return mediator; } }
package com.jerry.pattern.mediator; /** * note: 具体调停者角色 */ public class ConcreteMediator extends Mediator { private Colleague1 colleague1; private Colleague2 colleague2; private Colleague3 colleague3; /** * 将所有同事 实例化 */ public void createConcreteMediator() { colleague1 = new Colleague1(this); colleague2 = new Colleague2(this); colleague3 = new Colleague3(this); } /** * 事件方法 * * @param c */ public void colleagueChanged(Colleague c) { System.out.println("-----------------start-----------"); colleague1.action(); colleague2.action(); colleague3.action(); System.out.println("-----------------end-----------"); } /***********************************************************/ /*** * 提供同事对象 * * @return */ public Colleague1 getColleague1() { return colleague1; } /*** * 提供同事对象 * * @return */ public Colleague2 getColleague2() { return colleague2; } /*** * 提供同事对象 * * @return */ public Colleague3 getColleague3() { return colleague3; } }
package com.jerry.pattern.mediator; /** * note: 调停者角色 */ abstract public class Mediator { /** * 事件方法 * @param c */ public abstract void colleagueChanged(Colleague c); }
package com.jerry.pattern.mediator; /** * note: 具体同事角色 */ public class Colleague1 extends Colleague { public Colleague1(Mediator m) { super(m); } public void action() { System.out.println("This is an action from Colleague 1"); } }
package com.jerry.pattern.mediator; /** * note: 具体同事角色 */ public class Colleague2 extends Colleague { public Colleague2(Mediator m) { super( m ); } public void action() { System.out.println("This is an action from Colleague 2"); } }
package com.jerry.pattern.mediator; /*** * * * 2013-3-14 */ public class Colleague3 extends Colleague { public Colleague3(Mediator m) { super( m ); } public void action() { System.out.println("This is an action from Colleague 3"); } }将来添加优点和缺点,使用条件