定义
定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
前面已经说到,命令模式在GUI系统中比较常见,而观察者模式也是如此。GUI系统可利用观察者模式,使得具体的业务逻辑与UI解耦,实现灵活的编程。
消息队列、时间总线等处理机制,都可使用观察者模式实现。
实现
定义一个学生接口:
public interface IStudent {
void askForLeave();
void askForRelieve();
}
然后实现一个具体的学生类,而该学生是一个被观察者:
public class Student extends Observable implements IStudent {
@Override
public void askForLeave() {
setChanged();
notifyObservers("askForLeave");
}
@Override
public void askForRelieve() {
setChanged();
notifyObservers("askForRelieve");
}
}
Observable 类是 JDK 中提供的被观察者类,当调用其中的行为方法时,会通过 notifyObservers
方法通知所有的观察者。
定义一个观察者,监控学生的行为:
public class Teacher implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println(o.getClass().getSimpleName() + "有了新的活动" + (arg == null ? "" : ":" + arg));
}
}
可以看到 Teacher 类继承了 Observer 类,Observer 也是 JDK 中提供观察者类,当被观察者有了新的活动,会通过 update
方法更新 Teacher。
public class Client {
public static void main(String[] args) {
Student student = new Student();
Teacher teacher = new Teacher();
student.addObserver(teacher);
student.askForLeave();
student.askForRelieve();
}
}
运行后会打印出如下结果:
Student有了新的活动:askForLeave
Student有了新的活动:askForRelieve
Android 中的观察者模式
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
private final DataSetObservable mDataSetObservable = new DataSetObservable();
public boolean hasStableIds() {
return false;
}
public void registerDataSetObserver(DataSetObserver observer) {
mDataSetObservable.registerObserver(observer);
}
public void unregisterDataSetObserver(DataSetObserver observer) {
mDataSetObservable.unregisterObserver(observer);
}
/**
* Notifies the attached observers that the underlying data has been changed
* and any View reflecting the data set should refresh itself.
*/
public void notifyDataSetChanged() {
mDataSetObservable.notifyChanged();
}
}
阅读过 BaseAdapter 源码的童鞋,一定知道其中有一个 DataSetObservable 对象,该对象就是一个被观察者,而观察者是谁呢?
@Override
public void setAdapter(ListAdapter adapter) {
if (mAdapter != null && mDataSetObserver != null) {
mAdapter.unregisterDataSetObserver(mDataSetObserver);
}
...
if (mAdapter != null) {
...
mDataSetObserver = new AdapterDataSetObserver();
mAdapter.registerDataSetObserver(mDataSetObserver);
...
} else {
...
}
...
}
当通过 setAdapter
方法设置适配器时,会新建一个 AdapterDataSetObserver 观察者对象,负责布局的刷新。
本文由
Fynn_ 原创,未经许可,不得转载!
网友评论