观察者模式在Android广播机制上的应用
点击跳转项目git地址:https://github.com/Arfer-ustc/practice-Android.git
一、观察者模式在Android中的应用及体现
Android中可以体现观察者模式的方式,例如消息机制EventBus、广播机制BroadcastReceiver、BanerView和RecycleView的list刷新机制等都涉及到观察者模式。首先介绍一下观察者模式的概念:观察者模式是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。举个例子,如下代码中,
package com.shijiacheng.observerpattern;
import java.util.Observable;
public class MyPerson extends Observable {
private String name;
private int age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
setChanged();
notifyObservers();
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
setChanged();
notifyObservers();
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
setChanged();
notifyObservers();
}
@Override
public String toString() {
return "MyPerson [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
注意到:setChanged();notifyObservers();多了这两句调用,通过setChanged();告知数据改变,通过notifyObservers();发送信号通知观察者。降低了类成员变量之间的耦合性,增加执行效率。
二、针对项目中的代码展开详细论述——广播机制中的观察者模式
Android中的广播机制非常灵活,Android可以对应用内自己需要的消息添加广播,也可以对应用外其他感兴趣的内容添加广播,例如应用可以收到手机系统关于手机电量的广播,也可以收到其他应用手机推送的广播,更可以收到应用内其他界面数据变化发来的广播。具体分布如下图所示:
从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。具体实现流程要点粗略概括如下:
- 在AndroidManifest文件中静态注册或在代码中进行动态注册,广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册
- 广播发送者通过binder机制向AMS发送广播
- AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中
- 消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法
由此看来,广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS属于中间的处理中心。广播发送者和广播接收者的执行是异步的,发出去的广播不会关心有无接收者接收,也不确定接收者到底是何时才能接收到。显然,整体流程与EventBus非常类似。
三、通过使用观察者模式带来的好处
观察者模式的应用使项目代码模块间的耦合性得到很好的降低,子模块的成员对父模块的依赖得到很好的解决,不需要我们因为一个因素的变化从而再去改变另一个因素,通过观察者模式,实时动态的反应元素变化,充当子模块跟父模块之间的管理桥梁,达到消息传递的作用。当一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式。观察者模式符合接口隔离原则,实现了对象之间的松散耦合