java23种设计模式七(连载)

七、调停者模式

       调停者模式包装了一系列相互作用的对象,使得这些对象相互之间不必显式的引用,从而极大的降低了对象间的耦合性,调停者模式通过引入调停者作为中间人,使得对象间既不用相互作用又能相互影响。

         调停者模式一般有以下几个角色:

          调停者:只是一个接口,定义了同事对象到调停者对象间的接口,可以是一个或多个方法

          具体的调停者:实现调停者的方法,将所有同事对象引入进来,从而负责协同各同事之间的关系

          同事对象:抽象出调停者到同事对象之间的接口

          具体的同事对象:实现不同同事之间具体所做的工作。

下面举个生动的例子以便更清晰的理解调停者模式:

          电脑主机的各个部分: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系统中的任务分发系统如果采用调停者模式是个比较不错的选择,每个部门或者每个任务都是相互独立的,完成一个任务后,交给调停者,让调停者通知下一个同事,完成相应的工作。

转载于:https://my.oschina.net/u/2323379/blog/880741

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值