Java对观察者模式的支持主要体现在Observable类和Observer接口。
(1) Observable 类代表 被观察者 (java.util.Observable )
主要方法有:
void setChanged() : 设置被观察者的状态已经被改变
void addObserver(Observer observer) : 添加观察者
int countObservers() : 返回所有观察者的数目
void deleteObserver(Observer observer) :删除指定观察者
void deleteObservers() : 删除所有观察者
boolean hasChanged() : 被观察者的状态是否被改变,如果是则返回true,否则返回false
void notifyObservers() : 通知所有观察者(没有参数)
void notifyObservers(Object arg) : 通知所有观察者(带参数,参数一般设定为被改变的属性)
void clearChanged() :清除被观察者状态的改变(即调用 hasChanged() 时会返回 false)
(2) Observer 接口代表 观察者 (java.util.Observer )
它只有一个抽象方法需要被具体的观察者类实现(很重要 ):
void update(Observable observable, Object arg) :当 被观察者 调用 notifyObservers(*) 方法时,会根据被观察者的hasChanged() 方法来判断它的状态是否被改变,如果被观察者的状态被改变了,则会调用观察者的update方法,参数observable 为 被观察者对象,arg 为调用notifyObservers(Object arg) 时传入的参数arg ,如果调用的是notifyObservers() 方法, 则arg为null(注意:应该把这个参数arg设定为被观察者的被改变的属性)。
下面是一个例子:
- package observer;
- import java.util.Observable;
- import java.util.Observer;
- class Good extends Observable{
- private String name;
- private float price;
- public Good(String name, float price) {
- this.name = name;
- this.price = price;
- }
- public String getName() {
- return name;
- }
- public float getPrice() {
- this.notifyObservers(price);
- return price; }
- public void setPrice(float price) {
- this.price = price;
- /*
- * 注意 :在通知 所有观察者之前
- * 一定要调用 setChanged()方法来设置被观察者的状态已经被改变,
- */
- this.setChanged();
- /*
- * notifyObservers 方法在通知完所有吗 观察者 后,
- * 会自动调用 clearChanged 方法来清除 被观察者 的状态改变。
- */
- this.notifyObservers(price);
- }
- }
- class Customer implements Observer{
- private String name;
- public Customer(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void update(Observable observable, Object arg) {
- if(observable instanceof Good && arg instanceof Float){
- System.out.println("客户<"+this.name+"> : "+((Good)observable).getName()+"的价格变了,"+arg+"元了 !");
- }
- }
- }
- public class Test {
- public static void main(String[] args){
- Good good = new Good("洗衣粉",3.5f);
- Customer tom = new Customer("Tom");
- Customer jerry = new Customer("Jerry");
- good.addObserver(tom);
- good.addObserver(jerry);
- good.setPrice(2.5f);
- good.setPrice(3.0f);
- }
- }
运行结果:
客户<Jerry> : 洗衣粉的价格变了,2.5元了 !
客户<Tom> : 洗衣粉的价格变了,2.5元了 !
客户<Jerry> : 洗衣粉的价格变了,3.0元了 !
客户<Tom> : 洗衣粉的价格变了,3.0元了 !
代码里面有一个地方需要着重提一下,就是Good这个类里的serPrice()这个方法,在这个方法里面,调用this.notifyObservers(price)之前一定要调用this.setChanged()方法,因为只有这样,this.notifyObservers(price)这个方法才会去调用update()。