易学设计模式14 调停者模式(Mediator)

调停者模式是对象的行为模式。调停者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显引用。从而使它们可以较松散地耦合。当这些对象中的某些对象之间的相互作用发生改变时,不会立即影响到其他的一些对象之间的相互作用。从而保证这些相互作用可以彼此独立地变化。

为什么需要调停者
如下图所示,这个示意图中有大量的对象,这些对象既会影响别的对象,又会被别的对象所影响,因此常常叫做同事(Colleague)对象。这些同事对象通过彼此的相互作用形成系统的行为。从图中可以看出,几乎每一个对象都需要与其他的对象发生相互作用,而这种相互作用表现为一个对象与另一个对象的直接耦合。这就是过度耦合的系统。


通过引入调停者对象(Mediator),可以将系统的网状结构变成以中介者为中心的星形结构,如下图所示。在这个星形结构中,同事对象不再通过直接的联系与另一个对象发生相互作用;相反的,它通过调停者对象与另一个对象发生相互作用。调停者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入造成大量的修改工作。


一个好的面向对象的设计可以使对象之间增加协作性(Collaboration),减少耦合度(Couping)。一个深思熟虑的设计会把一个系统分解为一群相互协作的同事对象,然后给每一个同事对象以独特的责任,恰当的配置它们之间的协作关系,使它们可以在一起工作。







抽象调停者(Mediator)角色
具体调停者(ConcreteMediator)角色
抽象同事类(Colleague)角色
具体同事类(ConcreteColleague)角色

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() {
		// 逗号前是视频显示的数据,逗号后是声音  
        this.data = "One Piece,海贼王我当定了"; 
     // 通知主板,自己的状态发生了改变  
        this.getMediator().changed(this);
	}

}

package com.jiaozg.mediator;

public class CPU extends Colleague {

	public CPU(Mediator mediator) {
		super(mediator);
	}

	 // 分解出来的视频数据  
    private String videoData = "";  
    // 分解出来的声音数据  
    private String soundData = "";  
    /** 
     * 获取分解出来的视频数据 
     */  
    public String getVideoData() {  
        return videoData;  
    }  
  
    /** 
     * 获取分解出来的声音数据 
     */  
    public String getSoundData() {  
        return soundData;  
    }  
    /** 
     * 处理数据,把数据分成音频和视频的数据 
     */  
    public void executeData(String data) {
    	// 把数据分解开,前面是视频数据,后面是音频数据 
    	String [] array = data.split(",");
    	this.videoData = array[0];
    	this.soundData = array[1];
    	this.getMediator().changed(this);
    }
	
}

package com.jiaozg.mediator;

public class VideoCard extends Colleague {

	public VideoCard(Mediator mediator) {
		super(mediator);
	}
	/** 
     * 显示视频数据 
     */  
	public void showData(String data) {
		System.out.println("您正在观看的是:" + data);  
	}
}

package com.jiaozg.mediator;

public class SoundCard extends Colleague {

	public SoundCard(Mediator mediator) {
		super(mediator);
	}
	
	public void soundData(String data) {
		System.out.println("画外音:" + data);  
	}

}

package com.jiaozg.mediator;

public interface Mediator {
	
	public void changed(Colleague c);

}

package com.jiaozg.mediator;

public class MainBoard implements Mediator {

	private CDDriver cdDriver = null;
	private CPU cpu = null;
	private VideoCard videoCard = null;
	private SoundCard soundCard = null;
	
	public void changed(Colleague c) {
		
		if(c instanceof CDDriver) {
			this.openCDDriverReadData(cdDriver);
		} else if(c instanceof CPU) {
			this.openCPU(cpu);
		}

	}
	
	private void openCDDriverReadData(CDDriver cd) {
		// 把这些数据传递给CPU进行处理 
		cpu.executeData(cd.getData());
	}
	
	public void openCPU(CPU cpu) {
		// 把这些数据传递给显卡和声卡展示出来
		videoCard.showData(cpu.getVideoData());
		soundCard.soundData(cpu.getSoundData());	
	}

	public void setCdDriver(CDDriver cdDriver) {
		this.cdDriver = cdDriver;
	}

	public void setCpu(CPU cpu) {
		this.cpu = cpu;
	}

	public void setVideoCard(VideoCard videoCard) {
		this.videoCard = videoCard;
	}

	public void setSoundCard(SoundCard soundCard) {
		this.soundCard = soundCard;
	}

}

package com.jiaozg.mediator;

public class Client {

	public static void main(String[] args) {
		// 创建调停者——主板
		MainBoard mediator = new MainBoard();
		// 创建同事类
		CDDriver cd = new CDDriver(mediator);
		CPU cpu = new CPU(mediator);
		VideoCard vc = new VideoCard(mediator);
		SoundCard sc = new SoundCard(mediator);
		// 让调停者知道所有同事  
		mediator.setCdDriver(cd);
		mediator.setCpu(cpu);
		mediator.setVideoCard(vc);
		mediator.setSoundCard(sc);
		// 开始看电影,把光盘放入光驱,光驱开始读盘
		cd.readCD();
	}

}


输出结果:

您正在观看的是:One Piece
画外音:海贼王我当定了

参考:http://blog.csdn.net/m13666368773/article/details/7712213

猜你喜欢

转载自jiaozhiguang-126-com.iteye.com/blog/1677791