控制台程序。
Obserable类提供了一个有趣的机制,可以把类对象中发生的改变通知给许多其他类对象。
对于可以观察的对象来说,类定义中需要使用java.util.Observable类。只需要简单地从Observable类派生出要监控对象所属的类即可。
用于观察器的类要实现Observer接口,只需要定义方法update()即可。这个方法在对应的Observable对象发生变化时调用。传送给update()方法的第一个参数是对Observable对象的引用,Observable对象发生了变化并导致调用update()方法。这样一来,Observer观察器对象就可以访问Observable对象中的公共方法,从而访问要显示的数据。update()方法的第二个参数把其他信息传送给Observer对象。
首先为可以显示变化的对象定义一个类:
1 import java.util.Observable; 2 3 public class JekyllAndHyde extends Observable { 4 public void drinkPotion() { 5 name = "Mr.Hyde"; 6 setChanged(); 7 notifyObservers(); 8 } 9 10 public String getName() { 11 return name; 12 } 13 14 private String name = "Dr. Jekyll"; 15 }
现在,给观察这些变化的人定义一个类:
1 import java.util.Observer; 2 import java.util.Observable; 3 4 public class Person implements Observer { 5 // Constructor 6 public Person(String name, String says) { 7 this.name = name; 8 this.says = says; 9 } 10 11 // Called when observing an object that changes 12 public void update(Observable thing, Object o) { 13 System.out.println("It's " + ((JekyllAndHyde)thing).getName() + " " + name + ": " + says); 14 } 15 16 private String name; // Person's identity 17 private String says; // What they say when startled 18 }
用下面的类可以让一些观察者观察Dr.Jekyll:
1 // Try out observers 2 import java.util.Observer; 3 4 public class Horrific { 5 public static void main(String[] args) { 6 JekyllAndHyde man = new JekyllAndHyde(); // Create Dr. Jekyll 7 8 Observer[] crowd = { 9 new Person("Officer","What's all this then?"), 10 new Person("Eileen Backwards", "Oh, no, it's horrible those teeth!"), 11 new Person("Phil McCavity", "I'm your local dentist here's my card."), 12 new Person("Slim Sagebrush", "What in tarnation's goin'on here?"), 13 new Person("Freaky Weirdo", "Real cool, man. Where can I get that stuff?") 14 }; 15 16 // Add the observers 17 for(Observer observer : crowd) { 18 man.addObserver(observer); 19 } 20 man.drinkPotion(); // Dr. Jekyll drinks up 21 } 22 }
对man对象调用drinkPotion()方法会导致内部名称被改变,调用man对象的setChang()方法,在调用从Obxervable类继承的notifyObservers()方法。这会对每个已注册的观察期调用update()方法以生成输出。