七、调停者模式
调停者模式包装了一系列相互作用的对象,使得这些对象相互之间不必显式的引用,从而极大的降低了对象间的耦合性,调停者模式通过引入调停者作为中间人,使得对象间既不用相互作用又能相互影响。
调停者模式一般有以下几个角色:
调停者:只是一个接口,定义了同事对象到调停者对象间的接口,可以是一个或多个方法
具体的调停者:实现调停者的方法,将所有同事对象引入进来,从而负责协同各同事之间的关系
同事对象:抽象出调停者到同事对象之间的接口
具体的同事对象:实现不同同事之间具体所做的工作。
下面举个生动的例子以便更清晰的理解调停者模式:
电脑主机的各个部分: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系统中的工作流如果采用调停者模式是个比较不错的选择,每个部门或者每个任务都是相互独立的,完成一个任务后,交给调停者,让调停者通知下一个同事,完成相应的工作。
时间: 2024-11-08 23:58:19