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 }