設計模式17——Observer設計模式

Observer觀察者設計模式用於將對象的變化通知給感興趣的用戶。在Observer模式中的角色爲主題(subject)與觀察者(observer),觀察者訂閱它感興趣的主題,一個主題能夠被多個觀 察者訂閱,當主題的狀態發生變化時,它必須通知(notify)全部訂閱它的觀察者,觀察者檢視主題的狀態變化,並做出對應的動做,因此Observer模式也稱之爲Publish-Subscribe模式。 Observer觀察者設計模式結構以下: java

觀察者模式順序圖以下: 編程


以一個電子商務網站商品價格變時通知訂閱用戶爲例,演示Observer觀察者設計模式,代碼以下: 設計模式

//主題
interface Subject{
    //註冊觀察者
    public void registerObserver(Observer o);
    //註銷觀察者
    public void unregisterObserver(Observer o);
    //通知觀察者
    public void notifyObservers();
}


//觀察者
interface Observer{
    //更新價格信息
    public void update(float price);
}


//商品
class Product implements Subject{
    //觀察者列表
    private List<Observer> observers = new ArrayList<Observer>();
    private float price;

    public void registerObserver(Observer o){
        observers.add(o);
    }

    public void unregisterObserver(Observer o){
        observers.remove(o);
    }

    public void notifyObservers(){
        for(Observer observer : observers){
            //主題向觀察者推送更新數據
            observer.update(price);
        }
    }

    public void priceChanged(){
        notifyObservers();
    }

    public void setPrice(float price){
        this.price = price;
        priceChanged();
    }
}


//訂閱者
class Subscriber implements Observer{
    private float currentPrice;
    //觀察者引用主題
    private Subject product;

    public Subscriber(Subject product){
        this.product = product;
        //主題註冊觀察者
        product.registerObserver(this);
    }

    public void update(float price){
        this. currentPrice = price;
        System.out.println(「Current price change to:」 + currentPrice);
    }
}


public class ObserverDemo{
    public static void main(String[] args){
        Subject product = new Product();
        Subscriber subscriber = new Subscriber(product);
        product.setPrice(10.98);
        product.setPrice(998.15);
    }
}


在java的java.util中內置了Observer觀察者設計模式,其中: 測試

(1).java.util.Observable是主題類,全部繼承了該類的類是事件發生的主題,也是被觀察的對象。java.util.Observable的經常使用方法有: 網站

a.public void addObserver(Observer o):爲主題添加觀察者。 this

b.publicvoid deleteObserver(Observer o):刪除某個觀察者。 spa

c.publicvoid deleteObservers():刪除主題上的全部觀察者。 設計

d.publicboolean hasChanged():測試主題是否改變。 code

e.protectedvoid setChanged():標記該主題對象已經改變。 server

f.publicvoid notifyObservers():通知全部觀察者對象已經已經改變。

(2).java.util.Observer接口是觀察者,全部實現了該接口的類都是主題事件的觀察者,該接口只有一個方法須要實現:

publicvoid update(Observable o,  Object arg):通知觀察者更新已經改變的主題。

使用JDK內置的Observer觀察者設計模式,演示電子商務網站商品價格的例子以下:

//商品
class Product extends Observable{
    private float price;

    public void priceChanged(){
        //設置變化點
        setChanged();
        //通知觀察者
        notifyObservers();
    }

    public void setPrice(float price){
        this.price = price;
        priceChanged();
    }
    public float getPrice(){
        return price;
    }
}


//訂閱者
class Subscriber implements Observer{
    private float currentPrice;
    //觀察者引用主題
    private Observable observable;

    public Subscriber(Observable observable){
        this. observable = observable;
        //主題註冊觀察者
        observable.addObserver(this);
    }

    public void update(Observable observable, Object arg){
        if(observable instanceof Product){
            Product product = (Product) observable;
            this. currentPrice = product.getPrice();
            System.out.println(「Current price change to:」 + currentPrice);
        }
    }
}


public class ObserverDemo{
    public static void main(String[] args){
        Observable product = new Product();
        Subscriber subscriber = new Subscriber(product);
        product.setPrice(10.98);
        product.setPrice(998.15);
    }
}


Observer觀察者設計模式在界面編程中應用普遍,一個button每每會註冊一個onclickListener,裏面有onclickAction方法對點擊進行響應,此時button充當的就是主題,而onclickListener就是觀察者,而onclickAction就對應着觀察者中對事件進行響應的update方法。

JDK中觀察者模式的應用:

java.util.Observer
java.util.Observable
java.util.EventListener
javax.servlet.http.HttpSessionBindingListener
javax.servlet.http.HttpSessionAttributeListener
javax.faces.event.PhaseListener
相關文章
相關標籤/搜索