大家可能都在用RxJava 或者是EventBus 吧!其实这两种工具都是运用的观察者模式,要想弄懂上面两个库,观察者模式是基础。接下来我就简单的介绍一下观察者模式。
观察者模式分为两个部分:观察者(observer)和被观察者(observable). 和我们平常使用的监听回调不同(一对一),观察者模式采用的是一对多的形式,当被观察者发生改变之后,发送消息给观察者,然后观察者做出相应的改变,这就是观察者模式。
示意图如下:
下面看一个简单的例子:
被观察者:
public class Subject {
private List<Observer> mObservers = new ArrayList<>();
/**
* 绑定被观察者
* @param observer 观察者
*/
public void attach(Observer observer) {
mObservers.add(observer);
}
/**
* 解绑定
* @param observer
*/
public void deAttach(Observer observer) {
mObservers.remove(observer);
}
/**
* 发送通知
* @param name
*/
public void notityAll(String name) {
for (Observer observer : mObservers) {
observer.update(name);
}
}
}
很简单,为了模仿一对多的环境,我们在被观察中,定义了一个集合,这个集合存储观察者对象。notifyAll()方法模式被观察者发生改变,通知观察者。
观察者:
public class Observer {
private Subject mSubject;
public Observer(Subject mSubject) {
this.mSubject = mSubject;
}
public void update(String name) {
System.out.println(System.currentTimeMillis()+<span style="font-family: 'Microsoft YaHei';">"接收到了+ " + name);</span>
}
public void attachSubject() {
if (mSubject != null)
mSubject.attach(this);
}
public void deAttachSubject() {
if (mSubject != null)
mSubject.deAttach(this);
}
}
public class FourActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_four);
Subject mSubject = new Subject();
Observer observer1 = new Observer(mSubject);
observer.attachSubject();
Observer observer2 = new Observer(mSubject);
observer1.attachSubject();
mSubject.notityAll("我是谁");
}
}
运行结果
10-24 10:23:49.211 29086-29086/com.rxjava I/System.out﹕ 1477275829211接收到了+ 我是谁
10-24 10:23:49.211 29086-29086/com.rxjava I/System.out﹕ 1477275829211接收到了+ 我是谁
两个观察者订阅了一个被观察者,被观察者发生改变,发送信息给订阅的观察者。
JAVA中的实现类
其实在Java中有相应的类帮我们实现了设计模式,分别是Observer(观察者) 和 Observable(被观察者) .
下面看一个简单例子:
被观察者:
public class SubjectZD extends Observable {
public void notity(String name) {
<span style="color:#ff0000;"> setChanged();
notifyObservers(name);</span>
}
}
观察者:
public class ObserverZD implements Observer {
public SubjectZD mSubjectZD;
public ObserverZD(SubjectZD mSubjectZD) {
this.mSubjectZD = mSubjectZD;
mSubjectZD.addObserver(this);
}
@Override
public void update(Observable observable, Object data) {
if (observable instanceof SubjectZD) {
System.out.println("observable = " + data.toString());
}
}
}
测试代码:
SubjectZD subjectZD = new SubjectZD();
ObserverZD observerZD = new ObserverZD(subjectZD);
ObserverZD observerZD1 = new ObserverZD(subjectZD);
subjectZD.notity("我是谁");
observer 中主要有两个方法setChanged()和notifyObservers()就可以通知到Observer了。
ok 代码到此结束
有了这个基础我们就方便了解 RxJava 和 EventBus 了,