Java 觀察者模式
網(wǎng)上商店中的商品在名稱、價格發(fā)生變化時,必須自動通知會員,Java的API為我們提供了Observer接口和Observable類來實(shí)現(xiàn)所謂觀察者模式。
Observable(可觀察者)類允許在自身發(fā)生改變時,通知其它對象(實(shí)現(xiàn)接口Observer,觀察者)。
下面是一個可觀察者(產(chǎn)品類):
import java.util.*;
public class product extends Observable{
private String name;////產(chǎn)品名
private float price;////價格
public String getName(){ return name;}
public void setName(String name){
this.name=name;
////設(shè)置變化點(diǎn)
setChanged();
notifyObservers(name);////通知觀察者
}
public float getPrice(){ return price;}
public void setPrice(float price){
this.price=price;
////設(shè)置變化點(diǎn)
setChanged();
notifyObservers(new Float(price));
}
////以下可以是數(shù)據(jù)庫更新 插入命令.
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;
////產(chǎn)品名稱改變值在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);
}
}
運(yùn)行結(jié)果:
C:\java>java Test
NameObserver :name changet to applet
PriceObserver :price changet to 9.22