package android.database;
import java.util.ArrayList;
public abstract class Observable
protected final ArrayList
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
2.下面是一个DataSetObservable观察者设计模式,它继承了基类Observable,明确了观察者成员的类型,如下:
package android.database;
public class DataSetObservable extends Observable
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
3.class DataSetObserver究竟是啥样?如下:
package android.database;
public abstract class DataSetObserver {
public void onChanged() {
// Do nothing
}
public void onInvalidated() {
// Do nothing
}
}
没错,只有这么两个方法,而且是do nothing,老祖宗就是不一样呀,什么都不用做了,同时它并不知道子子孙孙都要做些什么,所以在这里它就清闲了,所以说,继承DataSetObserver的类,如果想实时更新数据的话,就要重新定义这两个函数了。
观察者一般运用在一对多的,需要实时更新数据的情况下,比如一个音乐播放器的listview在一些音乐数据被删除了以后,需要实时更新最新的数据,那么这个时候观察者是很好的选择。