什么是中介者模式
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必明显作用,从而使他们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他对象之间的作用。保证这些作用可以独立变化。
中介者模式适用场景
对象之间交互操作过多且每个操作依赖彼此,防止修改一个对象行为影响全局。
中介者模式的角色
Mediator:抽象中介者角色
ConcreteNediator:具体中介者角色
Colleague:抽象同事类角色
ConcreteColleague:具体同时类 角色
中介者模式用例
电脑主板处理了很多事情,我们插上CD播放视频,cpu处理数据,显卡显示图像数据,声卡播放声音数据等
UML类图
抽象主板类AbstractMediator:
public abstract class AbstractMediator {
abstract void changed(AbstractColleague c);
}
具体主板类:
public class MainBoard extends AbstractMediator {
private CD cd;
private CPU cpu;
private Display display;
private Sound sound;
@Override
void changed(AbstractColleague c) {
//cd读取数据
if(c == cd){
handleCD((CD)c);
}
//cpu处理数据
else if(c == cpu){
handleCPU((CPU)c);
}
}
//cpu读取数据后与其他设备交互
private void handleCPU(CPU cpu){
sound.soundPlay(cpu.getDataSound());
display.display(cpu.getDataVideo());
}
//cd读取后交互cpu
private void handleCD(CD cd){
cpu.decodeData(cd.read());
}
public void setCPU(CPU cpu){
this.cpu = cpu;
}
public void setDisplay(Display display){
this.display = display;
}
public void setUSB(CD cd){
this.cd = cd;
}
public void setSound(Sound sound){
this.sound = sound;
}
}
抽象同事类AbstractColleague:
public abstract class AbstractColleague {
protected AbstractMediator mediator;
public AbstractColleague(AbstractMediator mediator){
this.mediator = mediator;
}
}
具体同事类CPU:
public class CPU extends AbstractColleague {
private String dataSound,dataVideo;
public CPU(AbstractMediator mediator) {
super(mediator);
}
public String getDataSound(){
return dataSound;
}
public String getDataVideo(){
return dataVideo;
}
public void decodeData(String data){
//划分数据为数组,第一个为视频,第二个为音频
String[] tmp = data.split(",");
dataVideo = tmp[0];
dataSound = tmp[1];
//通知主板处理身份改变
mediator.changed(this);
}
}
具体同事类CD:
public class CD extends AbstractColleague {
private String data;
public CD(AbstractMediator mediator) {
super(mediator);
}
public String read(){
return data;
}
public void load(){
data = "视频数据,音频数据";
mediator.changed(this);
}
}
具体同事类Display:
public class Display extends AbstractColleague {
public Display(AbstractMediator mediator) {
super(mediator);
}
public void display(String data){
System.out.println("画面显示+"+data);
}
}
具体同事类Sound:
public class Sound extends AbstractColleague {
public Sound(AbstractMediator mediator) {
super(mediator);
}
public void soundPlay(String data){
System.out.println("声音来源+"+data);
}
}
主类测试:
public class Test {
public static void main(String[] args) {
//构造主板
MainBoard board = new MainBoard();
//构造零件
CPU cpu = new CPU(board);
Display display = new Display(board);
CD usb = new CD(board);
Sound sound = new Sound(board);
//各个零件安装到主板
board.setUSB(usb);
board.setDisplay(display);
board.setCPU(cpu);
board.setSound(sound);
//插入usb播放数据
usb.load();
}
}
测试结果:
声音来源+音频数据
画面显示+视频数据
中介者模式总结
中介者模式就是用来协调多个对象之间的交互的,如果没有主板其他零件相互依赖,关系太复杂。中介模式的优点就是使得类之间的耦合度更小,使原本关系网状错杂的对象,变得结构清晰。中心就是中介者。