七、调停者模式
调停者模式包装了一系列相互作用的对象,使得这些对象相互之间不必显式的引用,从而极大的降低了对象间的耦合性,调停者模式通过引入调停者作为中间人,使得对象间既不用相互作用又能相互影响。
调停者模式一般有以下几个角色:
调停者:只是一个接口,定义了同事对象到调停者对象间的接口,可以是一个或多个方法
具体的调停者:实现调停者的方法,将所有同事对象引入进来,从而负责协同各同事之间的关系
同事对象:抽象出调停者到同事对象之间的接口
具体的同事对象:实现不同同事之间具体所做的工作。
下面举个生动的例子以便更清晰的理解调停者模式:
电脑主机的各个部分:CPU、显卡、硬盘、光驱等配件,都是通过主板来调配的,如果没有主板,那么各配件相互协同比如自己去实现,而各个配件之间的接口又各不相同,必须根据没配件制定不同的转换器,那么若加上主板,主板作为调停者,他知道如何和每个配件打交道,各配件只需要把需要做的事情交给主板,主板再通知到每个配件,这样工作就能更好的协同完成。
接下来以电脑主板为例,请看具体的实现代码:
public interface Mediator {
public void changed(Colleague colleague);
}
public abstract class Colleague {
private Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public Mediator getMediator() {
return mediator;
}
}
public class CDDriver extends Colleague {
private String data = "";
public CDDriver(Mediator mediator) {
super(mediator);
}
public String getData() {
return data;
}
public void readCD(){
System.out.println("打开CD");
this.data = "读取光盘";
getMediator().changed(this);
}
}
public class CPU extends Colleague {
private String data = "";
public CPU(Mediator mediator) {
super(mediator);
}
public String getData() {
return data;
}
public void executeData(String data){
this.data = data;
System.out.println("CPU正在处理data:"+data);
getMediator().changed(this);
}
}
public class Display extends Colleague {
public Display(Mediator mediator) {
super(mediator);
}
public void showData(String data){
System.out.println("当前正在显示的数据是:"+data);
}
}
public class MainBoard implements Mediator {
private CDDriver driver = null;
private CPU cpu = null;
private Display display = null;
public void setDriver(CDDriver driver) {
this.driver = driver;
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public void setDisplay(Display display) {
this.display = display;
}
@Override
public void changed(Colleague colleague) {
if(colleague instanceof CDDriver){
openDriverData();
}else{
openCPU();
}
}
private void openDriverData(){
String data = driver.getData();
cpu.executeData(data);
}
private void openCPU(){
String data = cpu.getData();
display.showData(data);
}
}
public class Client {
public static void main(String[] args) {
MainBoard mediator = new MainBoard();
CDDriver driver = new CDDriver(mediator);
CPU cpu = new CPU(mediator);
Display display = new Display(mediator);
mediator.setDriver(driver);
mediator.setCpu(cpu);
mediator.setDisplay(display);
driver.readCD();
}
}
在实际案例中,比如OA系统中的任务分发系统如果采用调停者模式是个比较不错的选择,每个部门或者每个任务都是相互独立的,完成一个任务后,交给调停者,让调停者通知下一个同事,完成相应的工作。