概念:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用,what happen balabala,把多对多的相互作用转化成一对多的相互作用。
场景:租房子,租客和房东不需要相互作用,一切交给中介。
示例:
1、抽象中介者,Mediator
/**
* 抽象中介
* @author jin.li
*
*/
public abstract class Mediator {
public abstract void changed(Colleague colleague);
}
2、具体的中介者,主板
/**
* 主板中介
* @author jin.li
*
*/
public class MainBoard extends Mediator {
private CDDveice mCDDveice;
private CPU mCPU;
private SoundCard mSoundCard;
private GraphicsCard mGraphicsCard;
@Override
public void changed(Colleague colleague) {
if (colleague == mCDDveice) {
handleCD((CDDveice) colleague);
}
if (colleague == mCPU) {
handleCPU((CPU) colleague);
}
}
/**
* 处理光驱读取数据后与其他设备的交互
* @param cdDveice
*/
public void handleCD(CDDveice cdDveice) {
mCPU.decodeData(cdDveice.readData());
}
/**
* 处理CPU读取数据后和其他设备的交互
* @param cpu
*/
public void handleCPU(CPU cpu) {
mSoundCard.playSound(cpu.getDateSound());
mGraphicsCard.playVideo(cpu.getDateVideo());
}
public void setCPU(CPU cpu) {
this.mCPU = cpu;
}
public void setCDDevice(CDDveice cdDveice) {
this.mCDDveice = cdDveice;
}
public void setSoundCard(SoundCard soundCard) {
this.mSoundCard = soundCard;
}
public void setGraphicsCard(GraphicsCard graphicsCard) {
this.mGraphicsCard = graphicsCard;
}
}
3、抽象同事类
/**
* 抽象同事类
* @author jin.li
*
*/
public abstract class Colleague {
//每一个同事都应该知道中介
public Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
}
4、具体的同事,cpu,cd,sound,video。
/**
* CPU同事
* @author jin.li
*
*/
public class CPU extends Colleague{
private String mDataVideo;//视频数据
private String mDateSound;//音频数据
public CPU(Mediator mediator) {
super(mediator);
}
/**
* 获取视频数据
* @return
*/
public String getDateVideo() {
return mDataVideo;
}
/**
* 获取音频数据
* @return
*/
public String getDateSound() {
return mDateSound;
}
public void decodeData(String data) {
//省略解析数据的逻辑
mDataVideo = "这是视频";
mDateSound = "这是音频";
//通知中介,自身状态发生改变了
mediator.changed(this);
}
}
/**
* CPU同事
* @author jin.li
*
*/
public class CPU extends Colleague{
private String mDataVideo;//视频数据
private String mDateSound;//音频数据
public CPU(Mediator mediator) {
super(mediator);
}
/**
* 获取视频数据
* @return
*/
public String getDateVideo() {
return mDataVideo;
}
/**
* 获取音频数据
* @return
*/
public String getDateSound() {
return mDateSound;
}
public void decodeData(String data) {
//省略解析数据的逻辑
mDataVideo = "这是视频";
mDateSound = "这是音频";
//通知中介,自身状态发生改变了
mediator.changed(this);
}
}
/**
* 显卡同事
* @author jin.li
*
*/
public class GraphicsCard extends Colleague {
public GraphicsCard(Mediator mediator) {
super(mediator);
}
public void playVideo(String data) {
System.out.println(data);
}
}
/**
* 声卡同事
* @author jin.li
*
*/
public class SoundCard extends Colleague {
public SoundCard(Mediator mediator) {
super(mediator);
}
public void playSound(String data) {
System.out.println(data);
}
}
5、客户端
public class Client {
public static void main(String[] args) {
//构造主板对象
MainBoard mainBoard = new MainBoard();
//分别构造各个零部件
CDDveice cdDveice = new CDDveice(mainBoard);
CPU cpu = new CPU(mainBoard);
GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
SoundCard soundCard = new SoundCard(mainBoard);
//将各个零部件安装到主板
mainBoard.setCDDevice(cdDveice);
mainBoard.setCPU(cpu);
mainBoard.setSoundCard(soundCard);
mainBoard.setGraphicsCard(graphicsCard);
//开始播放
cdDveice.loadData();
}
}
总结:中介者模式就是用来协调多个对象之间的交互的,就像主板,没有主板这个中介者,那么cpu,cd,sound,video就需要相互建立关联,那太复杂了。
衍生:Andorid源码中的KeyguardViewMediator就是一个中介者,它里面有着各种管理者。
学习笔记:《Android源码设计模式解析与实战》