http://www.cnblogs.com/jaward/p/3277619.html
1、API
被观察者
java.util.Observable;
public class Observable extends Object
- void addObserver(Observer o); 如果该观察者集合里面没有这个观察者,添加进去。
- protected void clearChanged(); 把改变的状态清掉,即表示最近没有发生改变,使hasChanged()返回false
- int countObserver(); 返回该Observable对象的观察者个数
- void deleteObserver(Observer o); 删除一个观察者
- boolean hasChanged(); 查看该Observable是否发生了改变
- void notifyObservers(); 先调用hasChanged(),若返回true通知该对象所有观察者,然后用clearChanged()清掉状态
- void notifyObservers(Object o); 同上,上面观察者update()接收的是null,这里可以返回想要通知的数据。
- protected void setChanged(); 设置变化,使到调用hasChanged()会返回true
观察者
java.util.Observer
public interface Observer
- void update(Observable o, Object arg); 只要发生变化,notifyObservers()就会通知观察者。
2、用法
被观察类需要继承Observable类,在数据改变的地方(如set***();)里加上setChanged(),在需要监听的地方使用notifyObservers(Object o)。
观察者需实现Observer接口,对notifyObservers() 的提醒做出反应。
为Observable添加观察者。
1 //Test.java
2 import java.util.Observable;
3 import java.util.Observer;
4
5 class Product extends Observable {
6 private String name;
7 private float price;
8
9 public String getName() {
10 return this.name;
11 }
12
13 public void setName(String name) {
14 this.name = name;
15 setChanged();
16 notifyObservers(name);
17 }
18
19 public float getPrice() {
20 return this.price;
21 }
22
23 public void setPrice(float price) {
24 this.price = price;
25 setChanged();
26 notifyObservers(new Float(price));
27 }
28 }
29
30 class NameObserver implements Observer {
31 private String name = null;
32
33 public void update(Observable obj, Object arg) {
34 if (arg instanceof String) {
35 this.name = (String)arg;
36 System.out.println("NameObserver: name change to "+this.name);
37 }
38 }
39 }
40
41 class PriceObserver implements Observer {
42 private float price = 0;
43
44 public void update(Observable obj, Object arg) {
45 if (arg instanceof Float) {
46 price = ((Float)arg).floatValue();
47 System.out.println("PriceObserver: price changte to "+price);
48 }
49 }
50 }
51
52
53 public class Test {
54 public static void main(String args[]) {
55 Product product = new Product();
56
57 NameObserver nameobs = new NameObserver();
58 PriceObserver priceobs = new PriceObserver();
59
60
61 //add observer
62 product.addObserver(nameobs);
63 product.addObserver(priceobs);
64
65
66 product.setName("apple");
67 product.setPrice(9.22f);
68 }
69 }