定义
中介者模式包装了一系列对象相互调用的方式,使得这些对象不必明显相互作用。从而使它们可以松散耦合。当某些对象之间的耦合发生改变时,不会立即影响其他的一些对象之间的作用。保证这些对象可以彼此独立变化。
中介者模式将多对多的相互作用转化为一对多的相互作用。
中介者模式将对象的行为和协作抽象化,把对象在小尺度上与其他对象的相互作用分开处理。
使用场景
当对象之间的交互操作很多且每个对象的行为操作都相互彼此依赖时,为防止在修改一个对象的行为时,同时涉及修改很多其他对象的行为,可以采用中介者模式来解决紧凑耦合问题。
Android中中介者模式最常见的场景莫过于view之间的联动了。
模式结构
- Mediator 抽象中介者角色
定义了同事对象到中介者对象的接口,一般以抽象的方式实现 - ConcreteMediator 具体中介者角色
继承于抽象中介者,实现了父类定义的方法,它具体的同事对象接收消息,向具体的同事对象发出命令 - Colleague 抽象同事类角色
定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象 - ConcreteColleagueA/B 具体同事类角色
继承于抽象同事类,每个具体同事类都知道本身在小范围内的行为,而不知道它在大范围内的目的
简单实现
public abstract class Mediator {
public abstract void change(Colleague c);
}
抽象中介者Mediator
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
}
抽象同事Colleague
public class MainBoard extends Mediator {
private CDDevice cdDevice;
private CPU cpu;
private SoundCard soundCard;
private GraphicsCard graphicsCard;
@Override
public void change(Colleague c) {
if (c == cdDevice) {
handleCD((CDDevice) c);
} else if (c == cpu) {
handleCPU((CPU) c);
}
}
private void handleCD(CDDevice cdDevice) {
cpu.decodeData(cdDevice.read());
}
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;
}
}
主板中介者MainBoard,充当具体中介者角色,负责计算机各个组件的协调调度
public class CDDevice extends Colleague {
private String data;
public CDDevice(Mediator mediator) {
super(mediator);
}
public String read() {
return data;
}
public void load() {
data = "视频,音频数据流";
mediator.change(this);
}
}
CD设备,模拟音视频源文件的写入
public class CPU extends Colleague {
private String dataVideo, dataSound;
public CPU(Mediator mediator) {
super(mediator);
}
public String getDataVideo() {
return dataVideo;
}
public String getDataSound() {
return dataSound;
}
public void decodeData(String data) {
String[] tmp = data.split(",");
dataVideo = tmp[0];
dataSound = tmp[1];
mediator.change(this);
}
}
CPU类,解释计算机指令以及处理计算机软件中的数据,这里模拟得到音视频流数据
public class GraphicsCard extends Colleague {
public GraphicsCard(Mediator mediator) {
super(mediator);
}
public void videoPlay(String data) {
System.out.println("视频:" + data);
}
}
显卡类SoundCard,模拟显示图像信息
public class SoundCard extends Colleague {
public SoundCard(Mediator mediator) {
super(mediator);
}
public void soundPlay(String data){
System.out.println("音频:" + data);
}
}
声卡类SoundCard,模拟播放音频信息
public class Client {
public static void main(String[] args) {
//构造主板
MainBoard mainBoard = new MainBoard();
// 构造零件
CDDevice cd = new CDDevice(mainBoard);
CPU cpu = new CPU(mainBoard);
GraphicsCard gc = new GraphicsCard(mainBoard);
SoundCard sc = new SoundCard(mainBoard);
//零件安装到主板
mainBoard.setCdDevice(cd);
mainBoard.setCpu(cpu);
mainBoard.setGraphicsCard(gc);
mainBoard.setSoundCard(sc);
//播放
cd.load();
}
}
客户类调用结果:
音频:音频数据流
视频:视频
Process finished with exit code 0