中介者模式
一、简介
中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使他们可以松散耦合。当某些对象间的作用发生改变时不会立即影像其他的一些对象之间的作用。保证这些作用可以批次独立变化。中介者模式将多对多的相互做用转化为一对多的相互作用。中介者模式将对象的香味和协作抽象化,把对象在小尺度的行为与其他对象的相互作用分开处理。
二、使用场景
当对象之间的交互操作很多且每个对象的行为操作都彼此依赖时,为防止在修改一个对象的行为时影像其他对象的行为,可采用中介者模式。该模式将多对多的关系变成一对多的关系,将系统从网状结构变成以调停者为中心的星形结构,达到降低系统复杂性提高可扩展性的作用。
三、简单实现
这里以电脑主机为例来简单实现中介者模式,一般来说电脑主机包括cpu、内存、显卡等部分,这些部分分隔开来就是一个普通的零件,但是在主板的中介作用下把它们整合起来变成一个完整的整体,任何连个模块间通信都会经过主板。
//抽象中介类
public abstract class Mediator{
public abstract void changed(Components components);
}
//抽象部件类
public abstract class Components {
protected Mediator mediator;
public Components(Mediator mediator) {
this.mediator = mediator;
}
}
public class CPU extends Components{
private String video,sound;
public CPU(Mediator mediator) {
super(mediator);
}
public String getVideo() {
return video == null ? "" : video;
}
public String getSound() {
return sound == null ? "" : sound;
}
public void decodeData(String data){
String [] temp=data.split(",");
video=temp[0];
sound=temp[1];
mediator.changed(this);
}
}
public class CDDevice extends Components{
private String data;
public CDDevice(Mediator mediator) {
super(mediator);
}
public String getData() {
return data == null ? "" : data;
}
public void load(){
data="视频数据,音频数据";
mediator.changed(this);
}
}
public class GraphicsCard extends Components{
public GraphicsCard(Mediator mediator) {
super(mediator);
}
public void playVideo(String data){
Log.i(TAG, "playVideo: "+data);
}
}
public class SoundCard extends Components{
public SoundCard(Mediator mediator) {
super(mediator);
}
public void playSound(String data){
Log.i(TAG, "playSound: "+data);
}
}
public class MainBoard extends Mediator{
private CPU cpu;
private CDDevice cdDevice;
private GraphicsCard graphicsCard;
private SoundCard soundCard;
@Override
public void changed(Components components) {
if (components ==cpu){
handleCpu((CPU) components);
}else if (components==cdDevice){
handleCD((CDDevice) components);
}
}
private void handleCD(CDDevice components) {
cpu.decodeData(cdDevice.getData());
}
private void handleCpu(CPU components) {
soundCard.playSound(components.getSound());
graphicsCard.playVideo(components.getVideo());
}
public void setCpu(CPU cpu) {
this.cpu = cpu;
}
public void setCdDevice(CDDevice cdDevice) {
this.cdDevice = cdDevice;
}
public void setGraphicsCard(GraphicsCard graphicsCard) {
this.graphicsCard = graphicsCard;
}
public void setSoundCard(SoundCard soundCard) {
this.soundCard = soundCard;
}
}
public void Test(){
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();
}
四、小结
中介者模式主要用来协调多个对象之间的交互,多个对象间的交互都是通过中介者来完成。Android中Binder机制中的ServiceManager和Binder Driver就相当于中介者,协调各个服务端和客户端。
在使用中介者模式时我们要考虑多个类间的依赖关系是否足够复杂,如果原本并不复杂使用中介者模式后可能会变得复杂,所以在使用前要多考虑。