2010年4月28日 星期三

Design Pattern : 17 Observer

在一個程式主體(Generator),如果內部運算後產生一些變化,希望可以把變化的結果,通知外部特定對象,可以把要通知的對象都設定成Observer

在Generator內需要有把observer加入觀察的method(addObserver)
與通知observer的功能(notifyObserver),而在observer內,會需要有一個update的method
可以在接收到Generator的通知後,到Generator內取到結果,這樣當主體程式有所變化,所有設定的observer都會接收到通知,而做適當的訊息處理

參與者
1.Generator
   可以使用Observer的Class
   addObserver:把觀察者加進來的method
   notifyObserver:用來通知所有observer的method
   excute:執行程序,在這類別真正要執行的工作,當工作完成
一定要觸發notifyObserver通知所有的觀察者
   getNumber:這是讓Observer接收到通知後,回來取值得method


public abstract class Generator {
    private Vector<Observer> observers=new Vector<Observer>();   
    private int number;
    public void addObserver(Observer observer){
        observers.add(observer);       
    }
    public void deletObserver(Observer observer){
        observers.remove(observer);
    }
    private void notifyObserver(){
        Iterator<Observer> it=observers.iterator();
        while(it.hasNext()){           
            ((Observer)it.next()).update(this);
        }
    }
    public void excute(){
        Random random=new Random();
        number=random.nextInt(50);
        notifyObserver();
    };
    public int getNumber(){
        return number;
    };
}


2.Observer interface
   Observer可能有很多個,先設定一個所有observer需遵循的統一介面
   update:當obsever被通知,就是被Generator呼叫了這個updtae method
   在這個method內可以利用傳進來的Generator物件,再回去取到變化的值

public interface Observer {
    public abstract void update(Generator gen);
}


3.FirstObserver 實作類別

public class FirstObserver implements Observer {   
    public void update(Generator gen) {
        System.out.println("First:"+gen.getNumber());
    }
}


4.SecondObserver

public class SecondObserver implements Observer {
    public void update(Generator gen) {
        System.out.println("Second:"+gen.getNumber());
    }
}


5.Main外部程式
只要產生Generator,加入關聯的observer後
就可以執行他要做的動作,同時在這動作內也已經
包含了通知observer的功能


Generator gen=new Generator();
gen.addObserver(new FirstObserver());
gen.addObserver(new SecondObserver());
gen.excute();


沒有留言: