設計模式——觀察者模式

Java中內置的觀察者模式html

一、觀察者模式介紹

Observer對象是觀察者,Observable對象是被觀察者。java

官網api文檔:http://docs.oracle.com/javaapi

二、Observable類

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

Observable類用於建立能夠觀測到你的程序中其餘部分的子類。當這種子類的對象發生變化時,觀測類被通知。ide

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

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

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

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

第一,若是它被改變了,它必須調用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()方法中被調用。

四、類圖一份

輸入圖片說明

五、代碼例子

package cn.evchar.test;

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) {

        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 內置 觀察者模式

Observable 是一個類,致使不能多繼承,此時根據本身業務判斷是否知足本身的要求。或者能夠本身實現

相關文章
相關標籤/搜索