JAVA设计模式-Observer

  Java提供了Observer模式的默认实现,下面我们就看一下Java对观察者模式的支持。
    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设定为被观察者的被改变的属性)。

 

    下面是一个例子:

 

   

  1. package observer;  
  2.   
  3. import java.util.Observable;  
  4. import java.util.Observer;  
  5.   
  6. class Good extends Observable{    
  7.     private String name;    
  8.     private float price;    
  9.     public Good(String name, float price) {    
  10.         this.name = name;    
  11.         this.price = price;    
  12.     }    
  13.     public String getName() {    
  14.         return name;    
  15.     }    
  16.     public float getPrice() {    
  17.         this.notifyObservers(price);    
  18.         return price;       }    
  19.     public void setPrice(float price) {    
  20.         this.price = price;    
  21.         /*  
  22.          * 注意 :在通知 所有观察者之前  
  23.          * 一定要调用 setChanged()方法来设置被观察者的状态已经被改变,  
  24.          */    
  25.         this.setChanged();    
  26.         /*  
  27.          * notifyObservers 方法在通知完所有吗 观察者 后,  
  28.          * 会自动调用 clearChanged 方法来清除 被观察者 的状态改变。  
  29.          */    
  30.         this.notifyObservers(price);    
  31.     }    
  32. }    
  33.   
  34. class Customer implements Observer{    
  35.     private String name;    
  36.     public Customer(String name) {    
  37.         this.name = name;    
  38.     }    
  39.     public String getName() {    
  40.         return name;    
  41.     }    
  42.     public void update(Observable observable, Object arg) {    
  43.         if(observable instanceof Good && arg instanceof Float){    
  44.             System.out.println("客户<"+this.name+"> : "+((Good)observable).getName()+"的价格变了,"+arg+"元了 !");    
  45.         }  
  46.     }    
  47. }    
  48.   
  49. public class Test {    
  50.     public static void main(String[] args){    
  51.         Good good = new Good("洗衣粉",3.5f);    
  52.         Customer tom = new Customer("Tom");    
  53.         Customer jerry = new Customer("Jerry");    
  54.         good.addObserver(tom);    
  55.         good.addObserver(jerry);   
  56.         good.setPrice(2.5f);    
  57.         good.setPrice(3.0f);  
  58.     }    
  59. }    

 

    运行结果:

 

客户<Jerry> : 洗衣粉的价格变了,2.5元了 !

客户<Tom> : 洗衣粉的价格变了,2.5元了 !

客户<Jerry> : 洗衣粉的价格变了,3.0元了 !

客户<Tom> : 洗衣粉的价格变了,3.0元了 !

 

   

    代码里面有一个地方需要着重提一下,就是Good这个类里的serPrice()这个方法,在这个方法里面,调用this.notifyObservers(price)之前一定要调用this.setChanged()方法,因为只有这样,this.notifyObservers(price)这个方法才会去调用update()。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值