Java中內置的觀察者模式


Java中內置的觀察者模式

 

Observable類

  java.util.Observable

  http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html

 

  Observable類用於創建可以觀測到你的程序中其他部分的子類。當這種子類的對象發生變化時,觀測類被通知。

  觀測類必須實現定義了update()方法的Observer接口

  當一個觀測程序被通知到一個被觀測對象的改變時,update()方法被調用。

 

  顯然,Observable是一個抽象的主題對象

  一個被觀測的對象必須服從下面的兩個簡單規則:

  第一,如果它被改變了,它必須調用setChanged()方法。

  第二,當它准備通知觀測程序它的改變時,它必須調用notifyObservers()方法,這導致了在觀測對象中對update()方法的調用。

  注意:如果在調用notifyObservers()方法之前沒有調用setChanged()方法,就不會有什么動作發生。

  notifyObservers()方法中包含clearChanged()方法,將標志變量置回原值。

  notifyObservers()方法采用的是從后向前的遍歷方式,即最后加入的觀察者最先被調用update()方法。

 

Observer接口

  java.util.Observer

  http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html

 

  此接口中只有一個方法:

  void update(Observable o, Object arg) 

  這個方法在被觀察對象(Observable類)的notifyObservers()方法中被調用。

 

程序例子

  定義一個主題對象進行倒數計數,數字每次改變時,它的觀察者收到這個數字。

  一個觀察者每次收到通知后打印出數字,另一個觀察者在數字小於等於5時才開始打印。

 

package com.learnjava.observer;

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

class WatchedCounter extends Observable
{
    public void countdown(int number)
    {
        for (; number >= 0; --number)
        {
            // 設置改變變量
            setChanged();

            // 通知所有觀察者,將number作為參數信息傳遞給觀察者
            notifyObservers(number);

        }

    }
}

class Watcher1 implements Observer
{
    @Override
    public void update(Observable arg0, Object arg1)
    {
        System.out.println("Watcher1's number: " + arg1);

    }
}

class Watcher2 implements Observer
{
    @Override
    public void update(Observable arg0, Object arg1)
    {

        if (((Integer) arg1).intValue() <= 5)
        {
            System.out.println("Watcher2's number: " + arg1);
        }
    }
}

public class ObserverTest
{
    public static void main(String[] args)
    {
        WatchedCounter watchedCounter = new WatchedCounter();
        Watcher1 watcher1 = new Watcher1();
        Watcher2 watcher2 = new Watcher2();

        //添加觀察者
        watchedCounter.addObserver(watcher1);
        watchedCounter.addObserver(watcher2);

        //開始倒數計數
        watchedCounter.countdown(10);
    }

}

 

 

參考資料

  張龍老師Java SE系列視頻教程。

  本博客中關於觀察者模式的文章:

  Java讀書筆記12 事件處理基礎 Observer設計模式:

  http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html

  《Head First設計模式》 讀書筆記02 觀察者模式 Observer:

  http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html

  Java 事件模型基礎:監聽器、事件、事件源、事件注冊:

  http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html

  觀察者模式及Java實現例子:

  http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM