Java:應用Observer接口實踐Observer模式

        Java 中經過 Observable 類和 Observer 接口實現了觀察者模式。 Observer 對象是觀察者, Observable 對象是被觀察者。
1. 實現觀察者模式
實現觀察者模式很是簡單,
[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
2. 實例一
NumObserable 是一個被觀察者,當它的成員變量 data 的數值發生變化時,會通知全部的觀察者。
NumObserable.java
package com.zj.observer;
import java.util.Observable;
 
public class NumObservable extends Observable {
    private int data = 0;
 
    public int getData() {
       return data ;
    }
 
    public void setData( int i) {
       data = i;
       setChanged();
       notifyObservers();
    }
}
 
NumObserver 是觀察者。當它的被觀察者 (NumObserable) 執行了 notifyObservers() 後,它會執行 uodate() 方法。
NumObserver.java
package com.zj.observer;
import java.util.Observable;
import java.util.Observer;
 
public class NumObserver implements Observer{
    public void update(Observable o, Object arg) {
       NumObservable myObserable=(NumObservable) o;
       System. out .println( "Data has changed to " +myObserable.getData());
    }
}
 
測試類 SingleTest ,在這裏將觀察者加入到被觀察者的觀察列表中。
SingleTest.java
package com.zj.observer;
 
public class SingleTest {
    public static void main(String[] args) {
       NumObservable number = new NumObservable();
       number.addObserver( new NumObserver());
       number.setData(1);
       number.setData(2);
       number.setData(3);
    }
}
結果:
Data has changed to 1
Data has changed to 2
Data has changed to 3
3. 實例二
這個實例中,仍是對 data 進行觀察,擁有兩個觀察者,分別觀察奇數和偶數的變化,經過 notifyObservers(arg) 中的參數 arg 來識別通知信息。
被觀察者NumsObservable.java
package com.zj.observers;
import java.util.Observable;
 
public class NumsObservable extends Observable {
    public final static Integer ODD = 1;
    public final static Integer EVEN = 2;
    private int data = 0;
 
    public int getData() {
       return data ;
    }
 
    public void setData( int i) {
       data = i;
       Integer flag = EVEN ;
       if (( data & 0x0001) == 1)
           flag = ODD ;
       setChanged();
       notifyObservers(flag);
    }
}
 
奇數觀察者 OddObserver.java
package com.zj.observers;
import java.util.Observable;
import java.util.Observer;
 
public class OddObserver implements Observer {
    public void update(Observable o, Object arg) {
       if (arg == NumsObservable. ODD ) {
           NumsObservable myObserable = (NumsObservable) o;
           System. out .println( "OddObserver:Data has changed to " + myObserable.getData());
       }
    }
}
 
偶數觀察者 EvenObserver.java
package com.zj.observers;
import java.util.Observable;
import java.util.Observer;
 
public class EvenObserver implements Observer {
    public void update(Observable o, Object arg) {
       if (arg == NumsObservable. EVEN ) {
           NumsObservable myObserable = (NumsObservable) o;
           System. out .println( "EvenObserver:Data has changed to " + myObserable.getData());
       }
    }
}
 
測試類 MultiTest.java
package com.zj.observers;
 
public class MultiTest {
    public static void main(String[] args) {
       NumsObservable number = new NumsObservable();
       number.addObserver( new OddObserver());
       number.addObserver( new EvenObserver());
       number.setData(1);
       number.setData(2);
       number.setData(3);
    }
}
結果:
OddObserver:Data has changed to 1
EvenObserver:Data has changed to 2
OddObserver:Data has changed to 3
相關文章
相關標籤/搜索