定义:调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。
类图:
角色:
抽象调停者(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();
}
}
测试结果