package android.database;
import java.util.ArrayList;
public abstract class Observable<T> { //一个泛型
protected final ArrayList<T> mObservers = new ArrayList<T>(); //泛型类型的数组,用于保存观察者成员对象
public void registerObserver(T observer) {
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
if (mObservers.contains(observer)) {
throw new IllegalStateException("Observer " + observer + " is already registered.");
}
mObservers.add(observer);
}
public void unregisterObserver(T observer) {
if (observer == null) {
throw new IllegalArgumentException("The observer is null.");
}
synchronized(mObservers) {
int index = mObservers.indexOf(observer);
if (index == -1) {
throw new IllegalStateException("Observer " + observer + " was not registered.");
}
mObservers.remove(index);
}
public void unregisterAll() {
synchronized(mObservers) {
mObservers.clear();
}
}
}
观察者模式其实很简单,这里就是用注册函数把观察者成员加载到数组mObservers,就那么简单,这个类是泛型类型的,可以被扩展成注册任何类型的观察者,继承基类Observable的子类将会明确Observable<T>中T的类型。
2.下面是一个DataSetObservable观察者设计模式,它继承了基类Observable,明确了观察者成员的类型,如下:
package android.database;
public class DataSetObservable extends Observable<DataSetObserver> { //这里明确观察者成员的类型,是DataSetObserver
public void notifyChanged() {
synchronized(mObservers) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onChanged();
}
}
}
public void notifyInvalidated() {
synchronized (mObservers) {
for (int i = mObservers.size() - 1; i >= 0; i--) {
mObservers.get(i).onInvalidated();
}
}
}
}
从上面可以看到,DataSetObservable 和Observable<T>几乎是一样的,除了明确观察者成员类型,其他的上面都没做,在这里可以发现,观察者成员是有onChanged()和onInvalidated()这两个方法的,所以类DataSetObserver是什么样的,就差不多可以知道了,至少要有onChanged()和onInvalidated()这两个方法的。
3.class DataSetObserver究竟是啥样?如下:
package android.database;
public abstract class DataSetObserver {
public void onChanged() {
// Do nothing
}
public void onInvalidated() {
// Do nothing
}
}
没错,只有这么两个方法,而且是do nothing,老祖宗就是不一样呀,什么都不用做了,同时它并不知道子子孙孙都要做些什么,所以在这里它就清闲了,所以说,继承DataSetObserver的类,如果想实时更新数据的话,就要重新定义这两个函数了。
观察者一般运用在一对多的,需要实时更新数据的情况下,比如一个音乐播放器的listview在一些音乐数据被删除了以后,需要实时更新最新的数据,那么这个时候观察者是很好的选择。