调停者模式(mediator)/中介者模式:
以唐僧作为调停者,孙悟空、八戒、沙僧他们互相进行问候.为例子。
假设他们3个互相打招呼不用这个设计模式而是直接打招呼,那么以后有改动的话将会很无奈,用了该模式后会发现以后即便需要改动了也不需要改动什么,顶多就是改动下调停者的逻辑实现。
package design.mediator2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-2-4 下午05:21:45 <br> * */ public class Test { public static void main(String[] args) { /* * 调停者模式(mediator)/中介者模式 * 唐僧作为调停者,孙悟空、八戒、沙僧他们互相进行问候. * 如果不用调停者模式将会非常的混乱。 * 调停者模式实质上是调停者类拥有被调停者类的引用, * TangShengMediator唐僧作为调停者必须要拥有 孙悟空、八戒、沙僧 他们的引用, * 要不怎么进行调停呢。 */ //创建调停者 TangShengMediator m = new TangShengMediator(); //创建被调停者 SunWuKong swk = new SunWuKong(m); BaJie bj = new BaJie(m); ShaSheng ss = new ShaSheng(m); //互相进行问候 swk.sayHello(bj); swk.sayHello(ss); ss.sayHello(swk); ss.sayHello(bj); bj.sayHello(swk); bj.sayHello(ss); } }
package design.mediator2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-2-4 下午05:22:47 <br> * 唐僧作为调停者 */ public class TangShengMediator { private SunWuKong swk; private BaJie bj; private ShaSheng ss; public SunWuKong getSwk() { return swk; } public void setSwk(SunWuKong swk) { this.swk = swk; } public BaJie getBj() { return bj; } public void setBj(BaJie bj) { this.bj = bj; } public ShaSheng getSs() { return ss; } public void setSs(ShaSheng ss) { this.ss = ss; } public void sayHello(Person p) { if (p instanceof SunWuKong) { System.out.println("孙悟空在。。。"); } else if (p instanceof BaJie) { System.out.println("八戒在。。"); } else if (p instanceof ShaSheng) { System.out.println("沙僧在。。"); } } }
package design.mediator2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-2-4 下午05:22:07 <br> * 被调停的抽象类 */ public abstract class Person { //持有调停者的引用 protected TangShengMediator m; public Person(TangShengMediator m) { this.m = m; } //孙悟空、八戒、沙僧 相互间进行打招呼,这里其子类需要实现该方法,这看起来又有模板方法模式的影子 public abstract void sayHello(Person p); }
package design.mediator2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-2-4 下午05:24:03 <br> * 被调停者---孙悟空 */ public class SunWuKong extends Person { public SunWuKong(TangShengMediator m) { super(m); } @Override public void sayHello(Person p) { m.setSwk(this); m.sayHello(p); } }
package design.mediator2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-2-4 下午05:25:10 <br> * 被调停者---八戒 */ public class BaJie extends Person { public BaJie(TangShengMediator m) { super(m); } @Override public void sayHello(Person p) { m.setBj(this); m.sayHello(p); } }
package design.mediator2; /** * @author 作者 E-mail: [email protected] * @version 创建时间:2012-2-4 下午05:25:34 <br> * 被调停者---沙僧 */ public class ShaSheng extends Person { public ShaSheng(TangShengMediator m) { super(m); } @Override public void sayHello(Person p) { m.setSs(this); m.sayHello(p); } }