1.观察者模式最重要的作用?
解耦,将观察者和被观察者解耦。eg:ui层与具体的业务逻辑解耦
2.观察者模式的定义?
定义对象间一种一对多的依赖关系,使得每当一个对象(被观察者)状态发生改变,所有依赖他的对象(观察者)都会收到通知并自动更新。
3.分析JDK中的Observe和Observable.
observe是用于观察者实现的接口。里面就一个方法,用来更新。
void update(Observable observable,Object data);
Observable是用于被观察者来继承的类。持有观察者的集合,遍历观察者集合,调用观察者更新方法。
List observers=new ArrayList();
public void notifyObservers(Object data) {
int size =0;
Observer[] arrays =null;
synchronized(this) {
if(hasChanged()) {
clearChanged();
size =observers.size();
arrays =newObserver[size];
observers.toArray(arrays);
}
}
if(arrays !=null) {
for(Observer observer : arrays) {
observer.update(this,data);
}
}
}
4.结合Android源码
通常我们在listview添加数据后,都会调用adapter的notifyDateSetChanged()方法。notifyDateSetChanged
方法定义在BaseAdapter中
BaseAdapter.java
//数据集观察者
DataSetObservable mDataSetObservable=new DataSetObservable();
//当数据集变化,通知所有观察者
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
DataSetObservable.java
遍历所有观察者,调用每个观察者的onChange方法来通知他们被观察者发生了变化
public void notifyChanged() {
synchronized(mObservers) {
for(int i =mObservers.size() -1;i >=0;i--) {
mObservers.get(i).onChanged();
}
}
}
AdapterView中有一个内部类AdapterDateSetObserver,在listview中设置adapter时,会构造一个AdapterDateSetObserver,并且注册到adapter中,这就是一个观察者,而adapter中包含一个数据集可观察者DataSetObservable,在数据集发生变化时,开发者手动调用adapter.notifyDateSetChanged,而notifyDateSetChanged实际上会调用DataSetObservable的notifyChanged方法,该方法会遍历所有的观察者的onChanged方法,onChanged方法内部获取adapter中数据集的新数量,然后调用listview的requstLayout方法重新布局,更新ui。
网友评论