java.util包中提供的Observable类和Observer接口 实现了观察者模式。
Observer对象是观察者。
Observable对象是被观察者。
在被观察者Observable对象中调用setChanged()方法设置变化点。
通过notifyObservers();通知观察者 有变化了! 自动调用Observer对象的update()方法。
update(Observable o, Object arg)方法有俩个参数。
update方法的参数arg就是notifyObservers(arg);调用时传的参数(可以不传),
o参数就是被观察者对象。
通过Observable对象调用addObserver(Observer os)来说明谁观察谁。参数是观察者。
public class House extends Observable{ //表示房子可以被观察
private float price ; //价钱
public House(float price){
this.price = price ;
}
public float getPrice(){
return this.price ;
}
public void setPrice(float newPrice){
//修改价钱的时候应该引起观察者的注意
if(this.price != newPrice){
super.setChanged(); // 设置变化点
this.price = newPrice;
}
super.notifyObservers(price); // 通知价格有改变
}
public String toString(){
return "房子价格为:" + this.price ;
}
};
public class HousePriceObserver implements Observer{ //说明是观察者(但还没说明观察什么)
private String name ;
public HousePriceObserver(String name){ // 设置每一个购房者的名字
this.name = name ;
}
@Override
public void update(Observable o,Object arg){
if(arg instanceof Float){
System.out.print(this.name + "观察到价格更改为:") ;
System.out.println(((Float)arg).floatValue()) ;
}
}
};
//测试
public public class ObserDemo01{
public static void main(String args[]){
House h = new House(1000000) ;
HousePriceObserver hpo1 = new HousePriceObserver("购房者A") ;
HousePriceObserver hpo2 = new HousePriceObserver("购房者B") ;
HousePriceObserver hpo3 = new HousePriceObserver("购房者C") ;
//把观察者和被观察者匹配起来
h.addObserver(hpo1) ;
h.addObserver(hpo2) ;
h.addObserver(hpo3) ;
System.out.println(h) ; // 输出之前房子价格
h.setPrice(666666) ; // 修改房子价格
System.out.println(h) ; // 输出修改后房子价格
}
};
运行结果:
房子价格为:1000000.0
购房者C观察到价格更改为:666666.0
购房者B观察到价格更改为:666666.0
购房者A观察到价格更改为:666666.0
房子价格为:666666.0
参考文章一:梦_枫
参考文章二:红黑联盟