定義
中介者模式包裝了一系列對(duì)象相互調(diào)用的方式,使得這些對(duì)象不必明顯相互作用。從而使它們可以松散耦合。當(dāng)某些對(duì)象之間的耦合發(fā)生改變時(shí),不會(huì)立即影響其他的一些對(duì)象之間的作用。保證這些對(duì)象可以彼此獨(dú)立變化。
中介者模式將多對(duì)多的相互作用轉(zhuǎn)化為一對(duì)多的相互作用。
中介者模式將對(duì)象的行為和協(xié)作抽象化,把對(duì)象在小尺度上與其他對(duì)象的相互作用分開(kāi)處理。
使用場(chǎng)景
當(dāng)對(duì)象之間的交互操作很多且每個(gè)對(duì)象的行為操作都相互彼此依賴時(shí),為防止在修改一個(gè)對(duì)象的行為時(shí),同時(shí)涉及修改很多其他對(duì)象的行為,可以采用中介者模式來(lái)解決緊湊耦合問(wèn)題。
Android中中介者模式最常見(jiàn)的場(chǎng)景莫過(guò)于view之間的聯(lián)動(dòng)了。
模式結(jié)構(gòu)
- Mediator 抽象中介者角色
定義了同事對(duì)象到中介者對(duì)象的接口,一般以抽象的方式實(shí)現(xiàn) - ConcreteMediator 具體中介者角色
繼承于抽象中介者,實(shí)現(xiàn)了父類定義的方法,它具體的同事對(duì)象接收消息,向具體的同事對(duì)象發(fā)出命令 - Colleague 抽象同事類角色
定義了中介者對(duì)象的接口,它只知道中介者而不知道其他的同事對(duì)象 - ConcreteColleagueA/B 具體同事類角色
繼承于抽象同事類,每個(gè)具體同事類都知道本身在小范圍內(nèi)的行為,而不知道它在大范圍內(nèi)的目的
簡(jiǎn)單實(shí)現(xiàn)
public abstract class Mediator {
public abstract void change(Colleague c);
}
抽象中介者M(jìn)ediator
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;
}
}
主板中介者M(jìn)ainBoard,充當(dāng)具體中介者角色,負(fù)責(zé)計(jì)算機(jī)各個(gè)組件的協(xié)調(diào)調(diào)度
public class CDDevice extends Colleague {
private String data;
public CDDevice(Mediator mediator) {
super(mediator);
}
public String read() {
return data;
}
public void load() {
data = "視頻,音頻數(shù)據(jù)流";
mediator.change(this);
}
}
CD設(shè)備,模擬音視頻源文件的寫(xiě)入
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類,解釋計(jì)算機(jī)指令以及處理計(jì)算機(jī)軟件中的數(shù)據(jù),這里模擬得到音視頻流數(shù)據(jù)
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) {
//構(gòu)造主板
MainBoard mainBoard = new MainBoard();
// 構(gòu)造零件
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();
}
}
客戶類調(diào)用結(jié)果:
音頻:音頻數(shù)據(jù)流
視頻:視頻
Process finished with exit code 0