定义:调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
类图:
角色:
抽象调停者(Mediator)角色:定义出同事对象到调停者对象的接口,其中主要方法是一个(或多个)事件方法。
具体调停者(ConcreteMediator)角色:实现了抽象调停者所声明的事件方法。具体调停者知晓所有的具体同事类,并负责具体的协调各同事对象的交互关系。
抽象同事类(Colleague)角色:定义出调停者到同事对象的接口。同事对象只知道调停者而不知道其余的同事对象。
具体同事类(ConcreteColleague)角色:所有的具体同事类均从抽象同事类继承而来。实现自己的业务,在需要与其他同事通信的时候,就与持有的调停者通信,调停者会负责与其他的同事交互。
例:
仿照一个系统的制作过程,PM负责协调设计、开发、测试三者的角色来完成项目
//抽象调停者 public interface ProjectManagerInterface { public void toNextColleague(Colleague c); } //具体调停者 public class ProjectManager implements ProjectManagerInterface { private Developer developer; private Tester tester; public void toNextColleague(Colleague c) { if(c instanceof Designer){ developer.coding(); }else if(c instanceof Developer){ tester.test(); }else if(c instanceof Tester){ System.err.println("finish"); } } public void doAction(){ Designer designer = new Designer(this); developer = new Developer(this); tester = new Tester(this); designer.disignerImage(); } } //抽象同事类 public abstract class Colleague { //持有一个调停者对象 private ProjectManagerInterface mediator; /** * 构造函数 */ public Colleague(ProjectManagerInterface mediator){ this.mediator = mediator; } /** * 获取 项目老大 */ public ProjectManagerInterface getMediator() { return mediator; } } //具体同事类 设计 public class Designer extends Colleague{ public Designer(ProjectManagerInterface mediator) { super(mediator); } public void disignerImage(){ System.err.println("draw a circle..."); getMediator().toNextColleague(this); } } //具体同事类 开发 public class Developer extends Colleague{ public Developer(ProjectManagerInterface mediator) { super(mediator); } public void coding() { System.err.println("coding "); getMediator().toNextColleague(this); } } //具体同事类 测试 public class Tester extends Colleague { public Tester(ProjectManagerInterface mediator) { super(mediator); } public void test(){ System.err.println("test case..."); getMediator().toNextColleague(this); } } //测试客户端 public class Client { public static void main(String[] args) { ProjectManager projectManager = new ProjectManager(); projectManager.doAction(); } } 测试结果