火星文 技术研习社

Noname Cat, Keep Thinking
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

设计模式理解 - 伟大的【Observer 观察者模式】

Posted on 2006-04-08 20:09  剑廿三  阅读(305)  评论(0编辑  收藏  举报
某些物件的状态变化会自动通知观察者。

它实现一种“订阅、观察、通知”的效果。

但这些物件需要继承 Observable  类,观察者需要继承 Observer 接口。

以下是 Java 代码:

//产品类 可供Jsp直接使用UseBean调用 该类主要执行产品数据库插入 更新
public class product extends Observable{ 

  
private String name;
  
private float price;

  
public String getName(){ return name;}
  
public void setName(){
   
this.name=name;
  
//设置变化点 
   setChanged();
   notifyObservers(name);

  }   

  
public float getPrice(){ return price;}
  
public void setPrice(){
   
this.price=price;
  
//设置变化点
   setChanged();
   notifyObservers(
new Float(price)); 

  }

  
//以下可以是数据库更新 插入命令.
  public void saveToDb(){
  

}

//观察者NameObserver主要用来对产品名称(name)进行观察的
public class NameObserver implements Observer{

  
private String name=null;

  
public void update(Observable obj,Object arg){

    
if (arg instanceof String){

     name
=(String)arg;
     
//产品名称改变值在name中
     System.out.println("NameObserver :name changet to "+name);

    }

  }

}

//观察者PriceObserver主要用来对产品价格(price)进行观察的
public class PriceObserver implements Observer{

  
private float price=0;

  
public void update(Observable obj,Object arg){

    
if (arg instanceof Float){

     price
=((Float)arg).floatValue();
  
     System.out.println(
"PriceObserver :price changet to "+price);

    }

  }

}


观察的效果实现

public class Test {

  
public static void main(String args[]){

Product product
=new Product();

NameObserver nameobs
=new NameObserver();
PriceObserver priceobs
=new PriceObserver();

//加入观察者
product.addObserver(nameobs);
product.addObserver(priceobs);

product.setName(
"橘子红了");
product.setPrice(
9.22f); 

  }

}

你会在发现下面信息::

NameObserver :name changet to 橘子红了

PriceObserver :price changet to 9.22

这说明观察者在行动了.!!