23種設計模式之——觀察者模式

1.定義

Define a one-to-many dependency between objects so that when one object changes state,all itsdependents are notified and updated automatically。

定義對象間一種一對多的依賴關係,使得每當一個對象改變狀態,則所有依賴於它的對象都會得到通知並被自動更新。


2.釋義


● Subject被觀察者
定義被觀察者必須實現的職責,它必須能夠動態地增加、取消觀察者。它一般是抽象類
或者是實現類,僅僅完成作爲被觀察者必須實現的職責:管理觀察者並通知觀察者。
● Observer觀察者
觀察者接收到消息後,即進行update(更新方法)操作,對接收到的信息進行處理。
● ConcreteSubject具體的被觀察者
定義被觀察者自己的業務邏輯,同時定義對哪些事件進行通知。
● ConcreteObserver具體的觀察者
每個觀察在接收到消息後的處理反應是不同,各個觀察者有自己的處理邏輯。


3.通用代碼

被觀察者:

public abstract class Subject {
    //定義一個觀察者數組
    private Vector<Observer> obsVector = new Vector<Observer>();
    //增加一個觀察者
    public void addObserver(Observer o){
        this.obsVector.add(o);
    }
   //刪除一個觀察者
    public void delObserver(Observer o){
        this.obsVector.remove(o);
    }
    //通知所有觀察者
    public void notifyObservers(){
        for(Observer o:this.obsVector){
            o.update();
        }
    }
}
具體被觀察者:

public class ConcreteSubject extends Subject {
    //具體的業務
    public void doSomething(){
        /*
        * do something
        */
        super.notifyObservers();
    }
}
觀察者:

public interface Observer {
    //更新方法
    public void update();
}

具體觀察者:

public class ConcreteObserver implements Observer {
    //實現更新方法
    public void update() {
        System.out.println("接收到信息,並進行處理!");
    }
}
場景類:

public class Client {
    public static void main(String[] args) {
        //創建一個被觀察者
        ConcreteSubject subject = new ConcreteSubject();
        //定義一個觀察者
        Observer obs= new ConcreteObserver();
        //觀察者觀察被觀察者
        subject.addObserver(obs);
        //觀察者開始活動了
        subject.doSomething();
    }
}

4.優點

● 觀察者和被觀察者之間是抽象耦合
如此設計,則不管是增加觀察者還是被觀察者都非常容易擴展,而且在Java中都已經實現的抽象層級的定義,在系統擴展方面更是得心應手。
● 建立一套觸發機制

5.缺點

觀察者模式需要考慮一下開發效率和運行效率問題,一個被觀察者,多個觀察者,開發和調試就會比較複雜,而且在Java中消息的通知默認是順序執行,一個觀察者卡殼,會影響整體的執行效率。在這種情況下,一般考慮採用異步的方式。多級觸發時的效率更是讓人擔憂,大家在設計時注意考慮。

6.使用場景

● 關聯行爲場景。需要注意的是,關聯行爲是可拆分的,而不是“組合”關係。
● 事件多級觸發場景。
● 跨系統的消息交換場景,如消息隊列的處理機制。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章