概念
定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象的状态发生改变时,会通知所有的观察者对象,使他们能自动更新自己.
举个栗子
Android
中Button
的点击事件,当你点击触发点击事件时,它会根据之前的监听事件的不同产生不同的响应.
Android中的观察者模式
栗1: 除了上述的点击事件,在RecycleView中也存在着一种观察者模式,当你Adapter数据变化,需要刷新的时候,你需要通知Adapter刷新UI,而这里的通知实际上就是一种观察者模式.
private void setAdapterInternal(Adapter adapter, boolean compatibleWithPrevious,boolean removeAndRecycleViews) {
...
if (adapter != null) {
adapter.registerAdapterDataObserver(mObserver);
adapter.onAttachedToRecyclerView(this);
}
...
}
我们可以发现在setAdapter()
方法中它最终掉用了setAdapterInternal()
方法,这里面判断当adapter
不为空时,便为adapter
注册一个观察者,而Adapter
便是被观察者
public void registerAdapterDataObserver(AdapterDataObserver observer) {
mObservable.registerObserver(observer);
}
而当我们去通知adapter
去刷新新数据时,你会发现它调用了被观察者的notifychanged()
方法.
public final void notifyDataSetChanged() {
mObservable.notifyChanged();
}
public void notifyChanged() {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
我们最终发现,它调用了AdapterDataObserver
的抽象类的onChanged()
方法,而这个抽象类的实现类则是RecyclerViewDataObserver
@Override
public void onChanged() {
assertNotInLayoutOrScroll(null);
mState.mStructureChanged = true;
setDataSetChangedAfterLayout();
if (!mAdapterHelper.hasPendingUpdates()) {
requestLayout();
}
}
我们不去追究其中具体的通知细节,只需要知道整个流程.
当你使用adapter
的notify()
时,它会通知观察者(setAdapter()
时注册的)说,我这里已经改变了,你该刷新了,然后观察者调用自己的实现类(RecyclerViewDataObserver
)中的onChanged()
方法刷新自己.
栗2:
大名鼎鼎的RxJava
,是一个第三方库,它的主要思想是异步,非常适合在网络请求时使用,不过,它与观察者模式的巧妙结合,使用它,使得代码简洁明了,是响应式编程的一种体现,在这里我就不多提了,相信大家都非常熟悉,具体的分析就不做了.
结语
有错请指出,谢谢.
学无止境.