读书人

java 观察者设计形式

发布时间: 2012-10-08 19:54:56 作者: rapoo

java 观察者设计模式

设计思想:

?? 观察者模式定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有它的依赖对象将被自动通知并更新
第一种方式,采用API提供的接口和类来实现:

网上商店中的商品在名称、价格发生变化时,必须自动通知会员,Java的API为我们提供了
Observer接口和Observable类来实现所谓观察者模式。

? Observable(可观察者)类允许在自身发生改变时,通知其它对象(实现接口Observer,观察者)。
? 下面是一个可观察者(产品类):

import java.util.*;
public class product extends Observable{?
   private String name;////产品名
   private float price;////价格

   public String getName(){ return name;}
   public void setName(String name){
  ? this.name=name;
   ////设置变化点?
  ? setChanged();
  ? notifyObservers(name);////通知观察者

   }   

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

   }

?

   ////以下可以是数据库更新 插入命令.
   public void saveToDb(){
   System.out.println("saveToDb");
??? }

}

下面是两个观察者:
import java.util.*;
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);

     }

?????? }
   }

import java.util.*;
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("applet");
???? product.setPrice(9.22f);?

   }
}
运行结果:
C:\java>java?? Test
NameObserver :name changet to applet
PriceObserver :price changet to 9.22

C:\java>

?

第二种方式:手动写类和接口。

观察者接口代码:

package observer;public interface Observer {//所有观察者需要实现的方法。通知观察者的方法public void update(String obj);}

?名称观察者,该类实现了上面的接口:

package observer;public class NameObserver implements Observer {public void update(String obj) {String prefix = obj.substring(0,5);obj = obj.substring(5);if(prefix.equals("name:")){System.out.println("名称改变了! 当前的名称是:"+obj);}}}

??价格观察者,该类实现了上面的接口:

package observer;//观察者的实现类public class PriceObserver implements Observer{//观察者收到信息时需要处理的动作.public void update(String obj) {String prefix = obj.substring(0,6);obj = obj.substring(6);if(prefix.equals("price:"))System.out.println("价格改变了!当前的价格是:"+obj);}}

?

?

产品类:

package observer;import java.util.*;public class Product {private ArrayList obs = null;private String price = null;private String name = "";public String getName() {return name;}public void setName(String name) {if(this.name != name){//价格改变的时候才通知this.name = name;notifyObserver("name:"+this.name);//通知所有的观察者}}public String getPrice() {return price;}public void setPrice(String price) {if(this.price != price){//价格改变的时候才通知this.price = price;notifyObserver("price:"+this.price);//通知所有的观察者}}public Product(){obs = new ArrayList();}//注册观察者public void addObserver(Observer o){if(!obs.contains(o)){obs.add(o);}}//删除注册者public void deleteObserver(Observer o){if(obs.contains(o)){obs.remove(o);}}//通知所有的观察者.public void notifyObserver(String obj){Iterator it = obs.iterator();while(it.hasNext()){Observer ob = (Observer) it.next();ob.update(obj);}}}

?

测试类:

package observer;public class TestObserver {/** * 观察者测试类 */public static void main(String[] args) {Product p = new Product();Observer ob1 = new PriceObserver();Observer ob2 = new NameObserver();//注册观察者p.addObserver(ob1);p.addObserver(ob2);//被观察者的价格改变了。p.setPrice("98");p.setPrice("98");//注意这行看看会不会被通知p.setName("Dell studio 1535笔记本");}}

?

测试结果:

?

价格改变了!当前的价格是:98
名称改变了! 当前的名称是:Dell studio 1535笔记本

?

读书人网 >软件开发

热点推荐