Java中内置的观察者模式
Observable类
java.util.Observable
http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html
Observable类用于创建可以观测到你的程序中其他部分的子类。当这种子类的对象发生变化时,观测类被通知。
观测类必须实现定义了update()方法的Observer接口。
当一个观测程序被通知到一个被观测对象的改变时,update()方法被调用。
显然,Observable是一个抽象的主题对象。
一个被观测的对象必须服从下面的两个简单规则:
第一,如果它被改变了,它必须调用setChanged()方法。
第二,当它准备通知观测程序它的改变时,它必须调用notifyObservers()方法,这导致了在观测对象中对update()方法的调用。
注意:如果在调用notifyObservers()方法之前没有调用setChanged()方法,就不会有什么动作发生。
notifyObservers()方法中包含clearChanged()方法,将标志变量置回原值。
notifyObservers()方法采用的是从后向前的遍历方式,即最后加入的观察者最先被调用update()方法。
Observer接口
java.util.Observer
http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html
此接口中只有一个方法:
void update(Observable o, Object arg)
这个方法在被观察对象(Observable类)的notifyObservers()方法中被调用。
程序例子
定义一个主题对象进行倒数计数,数字每次改变时,它的观察者收到这个数字。
一个观察者每次收到通知后打印出数字,另一个观察者在数字小于等于5时才开始打印。
package com.learnjava.observer; import java.util.Observable; import java.util.Observer; class WatchedCounter extends Observable { public void countdown(int number) { for (; number >= 0; --number) { // 设置改变变量 setChanged(); // 通知所有观察者,将number作为参数信息传递给观察者 notifyObservers(number); } } } class Watcher1 implements Observer { @Override public void update(Observable arg0, Object arg1) { System.out.println("Watcher1's number: " + arg1); } } class Watcher2 implements Observer { @Override public void update(Observable arg0, Object arg1) { if (((Integer) arg1).intValue() <= 5) { System.out.println("Watcher2's number: " + arg1); } } } public class ObserverTest { public static void main(String[] args) { WatchedCounter watchedCounter = new WatchedCounter(); Watcher1 watcher1 = new Watcher1(); Watcher2 watcher2 = new Watcher2(); //添加观察者 watchedCounter.addObserver(watcher1); watchedCounter.addObserver(watcher2); //开始倒数计数 watchedCounter.countdown(10); } }
参考资料
张龙老师Java SE系列视频教程。
本博客中关于观察者模式的文章:
Java读书笔记12 事件处理基础 Observer设计模式:
http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html
《Head First设计模式》 读书笔记02 观察者模式 Observer:
http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html
Java 事件模型基础:监听器、事件、事件源、事件注册:
http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html
观察者模式及Java实现例子:
http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html