android Observable(观察者)的定义

1.android Observable(观察者)设计模式,原始的观察者类定义在路径frameworks\base\core\java\android\database\Observable.java中
具体如下:

package android.database;

import java.util.ArrayList;

 

public abstract class Observable { //一个泛型

  protected final ArrayList mObservers = new 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中T的类型。

2.下面是一个DataSetObservable观察者设计模式,它继承了基类Observable,明确了观察者成员的类型,如下:

package android.database;

 

public class DataSetObservable extends Observable { //这里明确观察者成员的类型,是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几乎是一样的,除了明确观察者成员类型,其他的上面都没做,在这里可以发现,观察者成员是有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在一些音乐数据被删除了以后,需要实时更新最新的数据,那么这个时候观察者是很好的选择。

你可能感兴趣的:(android Observable(观察者)的定义)