1、简介
调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。
当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
2、调停者模式类图
3、调停者模式涉及到的角色
3.1、抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法。
3.2、具体调停者(ConcreteMediator)角色:实现了抽象调停者所声明的事件方法。具体调停者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。
3.3、抽象同事类(Colleague)角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。
3.4、具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事交互。
4、源代码
4.1、抽象同事类角色
package Mediator; /** * ******************************************************** * @ClassName: Colleague * @Description: 抽象同事类角色 * ********************************************************** */ public abstract class Colleague { private Mediator mediator; /* * 构造器 将调停者对象作为参数接收 */ public Colleague(Mediator mediator) { // TODO Auto-generated constructor stub this.mediator=mediator; } /* * 取值方法 提供调停者对象 */ public Mediator getMediator() { return mediator; } /* * 行为方法 由子类实现 */ public abstract void action(); /* * 示意性商业方法 * 调用此方法可以改变对象的内部状态 */ public void change(){ mediator.changed(this); } }
4.2、具体同事类角色1
package Mediator; /** * ******************************************************** * @ClassName: Colleague1 * @Description:具体同事类角色1 * ********************************************************** */ public class Colleague1 extends Colleague{ public Colleague1(Mediator mediator) { super(mediator); } public void action() { System.out.println("这是同事类角色1"); } }
4.3、具体同事类角色2
package Mediator; /** * ******************************************************** * @ClassName: Colleague2 * @Description: 具体同事类角色2 * ********************************************************** */ public class Colleague2 extends Colleague{ public Colleague2(Mediator mediator) { super(mediator); } public void action() { System.out.println("这个是同事类角色2"); } }
4.4、抽象调停者角色
package Mediator; /** * ******************************************************** * @ClassName: Mediator * @Description: 抽象调停者角色 * ********************************************************** */ public interface Mediator { public void changed(Colleague c); }
4.5、具体调停者角色
package Mediator; /** * ******************************************************** * @ClassName: ConcreteMediator * @Description: 具体调停者角色 * ********************************************************** */ public class ConcreteMediator implements Mediator{ //持有并维护同事角色 private Colleague1 colleague1; private Colleague2 colleague2; /* *工厂方法 创建同事对象 */ public void createConcreteMediator(){ colleague1 = new Colleague1(this); colleague2 = new Colleague2(this); } /* * 取值方法 提供同事对象 */ public Colleague1 getColleague1() { return colleague1; } /* * 取值方法 提供同事对象 */ public Colleague2 getColleague2() { return colleague2; } @Override public void changed(Colleague c) { // TODO Auto-generated method stub colleague1.action(); colleague2.action(); } }
4.5、测试客户端
package Mediator; /** * ******************************************************** * @ClassName: Client * @Description: 调停者模式测试客户端 * ********************************************************** */ public class Client { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); mediator.createConcreteMediator(); Colleague2 colleague2 = new Colleague2(mediator); Colleague1 colleague1 = new Colleague1(mediator); mediator.changed(colleague1); } }
5、测试,运行结果如下