观察者模式

    java.util包内包含最基本的Observer接口与Observable类。


    

package java.util;

public interface Observer {
    
    void update(Observable o, Object arg);//
}

 

    被观察对象改变时,调用update方法更新。


package java.util;

public class Observable {
    private boolean changed = false;
    private Vector obs;

    public Observable() {
	obs = new Vector();
    }

    public synchronized void addObserver(Observer o) {
        if (o == null)
            throw new NullPointerException();
	   if (!obs.contains(o)) {
	       obs.addElement(o);
	   }
    }
    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }
    public void notifyObservers(Object arg) {

        Object[] arrLocal;

	   synchronized (this) {	   
	       if (!changed)
                  return;
            arrLocal = obs.toArray();
            clearChanged();
         }

        for (int i = arrLocal.length-1; i>=0; i--)
            ((Observer)arrLocal[i]).update(this, arg);
    }
    protected synchronized void setChanged() {
	   changed = true;
    }

......
}

 

      从源代码中,可以看出使用一种“注册——通知——撤销注册”的形式。首先将观察者(Observer)注册到被观察对象(Observable)中,被观察对象会将观察者存放在一个容器(Vector obs)里。当被观察对象发生了某种变化(setChanged())时,notifyObservers方法从容器中得到所有注册过的观察者,将变化通知观察者。
若观察者告诉被观察者要撤销观察,只需要被观察者从容器中将观察者去除即可。

      使用时,我们需要写一个类去继承Observable,并告诉它何时该通知观察者。示例代码如下:


package ObserverTest;

import java.util.Observable;
import java.util.Observer;

/**
 * 被观察对象
 * @author sukyl
 *
 */
class AccountObservable extends Observable {
	
	private double sum = 0.0;
	private double expenses = 0.0;
	private double saving = 0.0;
	
	AccountObservable(double sum){ this.sum = sum;}
	
	public double getSum() {	return sum;}

	public double getExpenses() { return expenses;  }
	public void setExpenses(double expenses) { 
		clear();
		super.setChanged();
		this.expenses = expenses; 
		this.sum -= this.expenses;
	}
	public double getSaving() { return saving; }
	public void setSaving(double saving) { 
		clear();
		super.setChanged();
		this.saving = saving;
		this.sum += this.saving;
	}
	
	public void clear(){
		this.expenses = 0.0;
		this.saving = 0.0;
	}
	
}

/**
 * 支出观察者
 * @author sukyl
 *
 */
class ConsumeObserver implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof AccountObservable){
			AccountObservable account = (AccountObservable)arg;	
			if(account.getExpenses()>0)
				System.out.println("-: "+account.getExpenses());
		}
	}

}

/**
 * 存款观察者
 * @author sukyl
 *
 */
class SavingObserver implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof AccountObservable){
			AccountObservable account = (AccountObservable)arg;	  
			if(account.getSaving()>0)
				System.out.println("+: "+account.getSaving());
		}
		
	}
	
}

/**
 * 余额观察者
 * @author sukyl
 *
 */
class SumObserver implements Observer {

	@Override
	public void update(Observable o, Object arg) {
		if(arg instanceof AccountObservable){
			AccountObservable account = (AccountObservable)arg;	  
			System.out.println("sum: "+account.getSum());
		}		
	}	
}

/**
 * 测试
 * @author sukyl
 *
 */
public class ObserverTest {
	
	public static void main(String[] args){
		ConsumeObserver observer1 = new ConsumeObserver();
		SavingObserver observer2 = new SavingObserver();
		SumObserver observer3 = new SumObserver();
		
		AccountObservable account = new AccountObservable(800);
		account.addObserver(observer1);//注册观察者对象
		account.addObserver(observer2);
		account.addObserver(observer3);
		
		account.setExpenses(100);
		System.out.println("-- notify 1 --");
		account.notifyObservers(account);
		account.setSaving(20);
		System.out.println("-- notify 2 --");
		account.notifyObservers(account);
		System.out.println("-- notify 3 --");
		account.notifyObservers(account);
		
		System.out.println("-- notify 4 --");
		account.deleteObserver(observer3);//移除观察者对象
		account.setSaving(70);
		account.notifyObservers(account);
		
	}
}






 

    输出:


   -- notify 1 --
   sum: 700.0
   -: 100.0
   -- notify 2 --
   sum: 720.0
  +: 20.0
  -- notify 3 --
  -- notify 4 --
  +: 70.0



  



你可能感兴趣的:(观察者模式)