观察者模式分离了观察者和被观察者自身的责任,让类各自维护自己的功能,提高了系统的可重用性。
怎么做?
代码示例:
import java.util.Observable;
import java.util.Observer;
/**
* 通过使用JDK中提供的{@link java.util.Observable} 以及 {@link java.util.Observer} 这两个类即可完成简单的观察者模式。
*
* <p>
* {@link Observable} 主要维护观察者(即被通知对象), 实现了 {@link Observer} 该接口表明是一个观察者,会被强制实现update方法来处理接收到通知后的行为,
* 当发生改变后,<code>Observable.notifyObservers()</code> 会遍历所有的观察者update方法
*
* @author pleuvoir
*
*/
public class Teacher extends Observable {
public void homeworkIsComing(String workname) {
System.out.println("当前有" + countObservers() + "个通知对象");
setChanged();
notifyObservers(workname + "来了");
}
public static class Student implements Observer{
public void update(Observable o, Object arg) {
Teacher teacher = (Teacher) o;
System.out.println(this.getClass().getName() + "收到" + teacher.getClass().getName() + "通知" + arg.toString());
}
}
public static void main(String[] args) {
Teacher teacher = new Teacher();
for (int i = 0; i < 9; i++) {
teacher.addObserver(new Student());
}
teacher.homeworkIsComing("寒假作业");
}
}
结果:
当前有9个通知对象
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
observer.Teacher$Student收到observer.Teacher通知寒假作业来了
结论
- 观察看上去是一个主动的行为,但是其实观察者不是主动调用自己的业务代码的,相反,是被观察者调用的。
- 基于此的还有更为具体的发布订阅模式和事件机制。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于