Android源码设计模式学习笔记-中介者模式
写代码的过程一定会遇到这样的情况,有多个模块,互相都有关联,比如说现在做一个登陆界面,你的账号密码的输入情况和登录按钮是否可以点击有关联,当然还有可能有一个记住密码的复选框,同时又有关联到是否账号密码的编辑框为空。像这种多个模块互相都有关联的情况下,可以使用中介者模式去降低耦合性。中介者模式的Uml图如下:
文章图片
image.png
【Android源码设计模式学习笔记-中介者模式】下面我们来看一个实际使用中介者模式的栗子
文章图片
image.png
我们电脑上有显示器,声卡,显卡,光驱,cpu等,它们其实不能直接通信,需要一个主板,这种情况下主板就是一个中介者,下面来以光驱播放视频为例来看看如何使用中介者模式实现.
抽象的被介绍者,相当于UML中的Colleague.
public abstract class Machine {
protected Mediator mediator;
public Machine(Mediator mediator){
this.mediator = mediator;
}
}
抽象的中介者
public abstract class Mediator {
public abstract void changed(Machine machine);
}
光驱
public class CDDevice extends Machine{private String data;
public CDDevice(Mediator mediator) {
super(mediator);
}/**
* 读取视频数据
*/
public String read(){
return data;
}/**
* 加载视频数据
*/
public void load(){
data = "https://www.it610.com/article/视频数据,音频数据";
mediator.changed(this);
}
}
cpu用来解码数据和调用声卡和显卡播放
public class Cpu extends Machine{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.changed(this);
}}
显卡
public class GraphicsCard extends Machine{public GraphicsCard(Mediator mediator) {
super(mediator);
}/**
* 播放视频
*/
public void videoPlay(String data){
System.out.println("视频: "+data);
}
}
声卡
public class SoundCard extends Machine{
public SoundCard(Mediator mediator) {
super(mediator);
}public void soundPlay(String data){
System.out.println("音频: "+data);
}
}
主板类,作为中介者,协调光驱和cpu,声卡,显卡的运行过程.
public class MainBoard extends Mediator{
private CDDevice cdDevice;
private Cpu cpu;
private SoundCard soundCard;
private GraphicsCard graphicsCard;
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;
}@Override
public void changed(Machine machine) {
if (cdDevice == machine){
handleCD(cdDevice);
}else if (cpu == machine){
handleCpu(cpu);
}
}private void handleCD(CDDevice cdDevice){
cpu.decodeData(cdDevice.read());
}private void handleCpu(Cpu cpu){
soundCard.soundPlay(cpu.getDataSound());
graphicsCard.videoPlay(cpu.getDataVideo());
}
}
最终调用
public static void main(String[] args){
MainBoard mainBoard = new MainBoard();
CDDevice cd = new CDDevice(mainBoard);
Cpu cpu = new Cpu(mainBoard);
GraphicsCard graphicsCard = new GraphicsCard(mainBoard);
SoundCard soundCard = new SoundCard(mainBoard);
mainBoard.setCdDevice(cd);
mainBoard.setCpu(cpu);
mainBoard.setGraphicsCard(graphicsCard);
mainBoard.setSoundCard(soundCard);
cd.load();
}
上面我们看到,所有的被介绍者,包括Cpu和CDDevice通过MainBoard的changed回调整理整个运行流程,这个流程由开发者定,如果没有MainBoard这个中介者Cpu和CDDevice的耦合性势必会存在高耦合性.
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备