什么是观察者模式?
- 观察者模式定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
- 观察者采用了“注册---通知---撤销注册”的形式
- Android中包含了对应观察者模式的两个类:DataSetObserver和DataSetObservable。
观察者和被观察者为了避免混淆这两个概念,给他俩取个别名:
- 观察者 = 响应者;
- 被观察者 = 改变者;
DataSetObserver:观察者,响应者
public abstract class DataSetObserver {
/**
* This method is called when the entire data set has changed,
* most likely through a call to {@link Cursor#requery()} on a {@link Cursor}.
*/
public void onChanged() {
// Do nothing
}
/**
* This method is called when the entire data becomes invalid,
* most likely through a call to {@link Cursor#deactivate()} or {@link Cursor#close()} on a
* {@link Cursor}.
*/
public void onInvalidated() {
// Do nothing
}
}
这里面提供了两个方法:
- onChanged():当被改变者发生了改变,会调用这个方法来通知响应者
- onInvalidated():当所有的数据都失效时,被调用;
DataSetObservable:被观察者,改变者
public class DataSetObservable extends Observable<DataSetObserver> {
/**
* Invokes {@link DataSetObserver#onChanged} on each observer.
* Called when the contents of the data set have changed. The recipient
* will obtain the new contents the next time it queries the data set.
*/
public void notifyChanged() {
synchronized(mObservers) {
// since onChanged() is implemented by the app, it could do anything, including
// removing itself from {@link mObservers} - and that could cause problems if
// an iterator is used on the ArrayList {@link mObservers}.
// to avoid such problems, just march thru the list in the reverse order.
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
}
/**
* Invokes {@link DataSetObserver#onInvalidated} on each observer.
* Called when the data set is no longer valid and cannot be queried again,
* such as when the data set has been closed.
*/
public void notifyInvalidated() {
synchronized (mObservers) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onInvalidated();
}
}
}
}
这里面依然有两个方法,与相应者中的两个方法一一对应
- notifyChanged():改变者发生了变化,调用这个方法去通知所用已经注册的响应者,并依次调用响应者的onChanged()方法。
- notifyInvalidated():当数据集合失效或者不再使用的时候,调用这个方法通知所有的响应者,并调用他们的onInvalidated()方法。
改变者继承了Observable,并且泛型传入DataSetObserver。这个Observable类很简单,就是提供了一个响应者的注册集合ArrayList<T> mObservers。提供了个方法:
- public void registerObserver(T observer):注册一个响应者;
- public void unregisterObserver(T observer):移除一个已经注册响应者;
- public void unregisterAll():移除所有已经注册的;
观察者模式的使用方式
- 继承DataSetObserver,并实现其中的两个方法,加入你希望在数据发生变化后的响应事件。
- 定义一个DataSetObservable改变者对象。这个对象不需要重写方法,只是用来注册和解除注册。
- 定义一个重写的DataSetObserver对象,并在初始化的时候,调用mObservable.registerObserver(observer);去注册
- 在你的数据发生变化的时候,调用改变着的notifyChanged()方法去通知响应者;
- 在使用结束后,调用改变者的unregisterObserver(observer)解除注册;