什么叫观察者
在解释观察者设计模式的概念之前,读者先来看一个简单的例子:现在很多的购房者都在关注着房子的价格变化,每当房子价格变化时,所有的购房者都可以观察得到,实际上以上的购房者都属于观察者,他们都在关注着房子的价格。实际上这就叫观察者设计模式,如图所示:
在Java中可以直接依靠Observable类和Observer接口轻松地实现以上功能
观察者模式实现
在java.util包中提供了Observable类和Observer类接口,使用它们即可完成观察者模式。需要被观察的类必须继承Observable类,Observable类的常用方法如表所示:
然后每一个观察者类都需要实现Observer接口,Observer接口定义如下:
public interface Observer{
void update(Observable o,Object arg);
}
在此接口中只定义了一个update方法,第一个参数表示被观察者实例,第二个参数表示修改的内容。
具体的代码实现如下所示:
import java.util.* ;
class House extends Observable{ // 表示房子可以被观察
private float price ;// 价钱
public House(float price){
this.price = price ;
}
public float getPrice(){
return this.price ;
}
public void setPrice(float price){
// 每一次修改的时候都应该引起观察者的注意
super.setChanged() ; // 设置变化点
super.notifyObservers(price) ;// 价格被改变
this.price = price ;
}
public String toString(){
return "房子价格为:" + this.price ;
}
};
class HousePriceObserver implements Observer{
private String name ;
public HousePriceObserver(String name){ // 设置每一个购房者的名字
this.name = name ;
}
public void update(Observable o,Object arg){
if(arg instanceof Float){
System.out.print(this.name + "观察到价格更改为:") ;
System.out.println(((Float)arg).floatValue()) ;
}
}
};
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) ; // 输出房子价格
}
};
程序运行结果:
从程序的运行结果可以发现,多个观察者都在关注着价格的变化,只要价格一有变化,则所有的观察者会立刻有所行动。