如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口。
- 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) ; // 输出房子价格
- }
- };
运行结果:
房子价格为:1000000.0购房者C观察到价格更改为:666666.0
购房者B观察到价格更改为:666666.0
购房者A观察到价格更改为:666666.0
房子价格为:666666.0
实现观察者模式
实现观察者模式非常简单,
[1]创建被观察者类,它继承自java.util.Observable类;
[2]创建观察者类,它实现java.util.Observer接口;
[3]对于被观察者类,
添加它的观察者:
void addObserver(Observer o)
|
addObserver()方法把观察者对象添加到观察者对象列表中。
当被观察事件发生时,执行:
setChanged();
notifyObservers();
|
setChange()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。
只有在setChange()被调用后,notifyObservers()才会去调用update()。
[4]对于观察者类,实现Observer接口的唯一方法update
void update(Observable o, Object arg)
|
形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。