應用Observer介面實踐Observer模式

weixin_34054866發表於2016-07-29

  

   

    原文:http://zhangjunhd.blog.51cto.com/113473/68949/

  

     在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
 1 package com.zj.observer;
 2 import java.util.Observable;
 3  
 4 public class NumObservable extends Observable {
 5     private int data = 0;
 6  
 7     public int getData() {
 8        return data;
 9     }
10  
11     public void setData(int i) {
12        data = i;
13        setChanged();
14        notifyObservers();
15     }
16 }
 
     NumObserver是觀察者。當它的被觀察者(NumObserable)執行了notifyObservers()後,它會執行uodate()方法。
     NumObserver.java
 1 package com.zj.observer;
 2 import java.util.Observable;
 3 import java.util.Observer;
 4  
 5 public class NumObserver implements Observer{
 6     public void update(Observable o, Object arg) {
 7        NumObservable myObserable=(NumObservable) o;
 8        System.out.println("Data has changed to " +myObserable.getData());
 9     }
10 }

 

    測試類SingleTest,在這裡將觀察者加入到被觀察者的觀察列表中。
SingleTest.java
 1 package com.zj.observer;
 2  
 3 public class SingleTest {
 4     public static void main(String[] args) {
 5        NumObservable number = new NumObservable();
 6        number.addObserver(new NumObserver());
 7        number.setData(1);
 8        number.setData(2);
 9        number.setData(3);
10     }
11 }

 

   結果:
   Data has changed to 1
   Data has changed to 2
   Data has changed to 3
 
   3.例項二
   這個例項中,還是對data進行觀察,擁有兩個觀察者,分別觀察奇數和偶數的變化,通過notifyObservers(arg)中的引數arg來識別通知資訊。
   被觀察者NumsObservable.java
 1 package com.zj.observers;
 2 import java.util.Observable;
 3  
 4 public class NumsObservable extends Observable {
 5     public final static Integer ODD = 1;
 6     public final static Integer EVEN = 2;
 7     private int data = 0;
 8  
 9     public int getData() {
10        return data;
11     }
12  
13     public void setData(int i) {
14        data = i;
15        Integer flag = EVEN;
16        if ((data & 0x0001) == 1)
17            flag = ODD;
18        setChanged();
19        notifyObservers(flag);
20     }
21 }

 

    奇數觀察者OddObserver.java

 1 package com.zj.observers;
 2 import java.util.Observable;
 3 import java.util.Observer;
 4  
 5 public class OddObserver implements Observer {
 6     public void update(Observable o, Object arg) {
 7        if (arg == NumsObservable.ODD) {
 8            NumsObservable myObserable = (NumsObservable) o;
 9            System.out.println("OddObserver:Data has changed to " + myObserable.getData());
10        }
11     }
12 }

偶數觀察者EvenObserver.java

 

 1 package com.zj.observers;
 2 import java.util.Observable;
 3 import java.util.Observer;
 4  
 5 public class EvenObserver implements Observer {
 6     public void update(Observable o, Object arg) {
 7        if (arg == NumsObservable.EVEN) {
 8            NumsObservable myObserable = (NumsObservable) o;
 9            System.out.println("EvenObserver:Data has changed to " + myObserable.getData());
10        }
11     }
12 }

 

測試類MultiTest.java

 

 1 package com.zj.observers;
 2  
 3 public class MultiTest {
 4     public static void main(String[] args) {
 5        NumsObservable number = new NumsObservable();
 6        number.addObserver(new OddObserver());
 7        number.addObserver(new EvenObserver());
 8        number.setData(1);
 9        number.setData(2);
10        number.setData(3);
11     }
12 }

 

結果:
OddObserver:Data has changed to 1

EvenObserver:Data has changed to 2

OddObserver:Data has changed to 3

 

 

 

 

相關文章