设计思想:
观察者模式定义了对象之间的一对多的依赖关系,当一个对象的状态发生改变时,所有它的依赖对象将被自动通知并更新
第一种方式,采用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笔记本