定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散偶合;中介者模式将多对多的相互作用转化为一对多的相互作用。
使用场景:当对象之间的交互操作很多且每个对象的行为操作都依赖彼此时,为了防止修改一个对象时,同时涉及修改其他对象的行为,可以采用中介者模式;
以电脑的主板、CPU、CD、声卡、显卡为例
/**
* 抽象中介者
*/
public abstract class MeDiator {
public abstract void changed(Colleague c);
}
/**
* 抽象同事
*/
public abstract class Colleague {
protected MeDiator meDiator;
public Colleague(MeDiator meDiator) {
this.meDiator = meDiator;
}
}
/**
* CPU同事
*/
public class CPU extends Colleague {
private String dataVideo,dataSound;//音频和视频数据
public CPU(MeDiator meDiator) {
super(meDiator);
}
public void decodeData(String data){
//分割音、视频数据
String[] tmp=data.split(",");
dataVideo=tmp[0];
dataSound=tmp[1];
//告诉中介者自身的状态
meDiator.changed(this);
}
public String getDataVideo() {
return dataVideo;
}
public String getDataSound() {
return dataSound;
}
}
/**
* 光驱同事
*/
public class CDDevice extends Colleague {
private String data;//视频数据
public CDDevice(MeDiator meDiator) {
super(meDiator);
}
/**
* 读取视频数据
*
* @return
*/
public String read() {
return data;
}
/**
* 加载视频数据
*/
public void load() {
//实际情况中视频数据和音频数据都是一个数据流
data="视频数据,音频数据";
//通知中介者,数据改变
meDiator.changed(this);
}
}
/**
* 显卡同事
*/
public class GraphicsCard extends Colleague {
public GraphicsCard(MeDiator meDiator) {
super(meDiator);
}
/**
* 播放视频
*
* @param data
*/
public void videoPlay(String data) {
Log.e("视频:" + data);
}
}
/**
* 声卡同事
*/
public class SoundCard extends Colleague {
public SoundCard(MeDiator meDiator) {
super(meDiator);
}
/**
* 播放音频
*
* @param data
*/
public void soundPlay(String data) {
Log.e("音频:" + data);
}
}
/**
* 主板中介者
*/
public class MainBoard extends MeDiator {
private CDDevice cdDevice;
private CPU cpu;
private SoundCard soundCard;
private GraphicsCard graphicsCard;
@Override
public void changed(Colleague c) {
//如果光驱读取了数据
if (c == cdDevice) {
handleCD((CDDevice) c);
} else if (c == cpu) {
handleCPU((CPU) c);
}
}
/**
* 处理光驱读取数据之后与其它设备的交互
*
* @param cdDevice
*/
private void handleCD(CDDevice cdDevice) {
cpu.decodeData(cdDevice.read());
}
/**
* 处理CPU读取数据之后与其它设别的交互
*
* @param cpu
*/
private void handleCPU(CPU cpu) {
soundCard.soundPlay(cpu.getDataSound());
graphicsCard.videoPlay(cpu.getDataVideo());
}
public void setCdDevice(CDDevice cdDevice) {
this.cdDevice = cdDevice;
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public void setSoundCard(SoundCard soundCard) {
this.soundCard = soundCard;
}
public void setGraphicsCard(GraphicsCard graphicsCard) {
this.graphicsCard = graphicsCard;
}
}
/**
* 客户类
*/
public class Client {
public static void main(String[] args) {
//创建主板
MainBoard mainBoard = new MainBoard();
//构建各个零件
CPU cpu = new CPU(mainBoard);
CDDevice cdDevice = new CDDevice(mainBoard);
GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
SoundCard soundCard = new SoundCard(mainBoard);
//安装零件
mainBoard.setCpu(cpu);
mainBoard.setCdDevice(cdDevice);
mainBoard.setGraphicsCard(graphicsCard);
mainBoard.setSoundCard(soundCard);
//完成后就可以开始放片片了
cdDevice.load();
}
}
网友评论