設計模式(四)——觀察者模式

設計模式(四)——觀察者模式

模式動機

​ 將一個系統設計爲一系列相互協作的類,往往也會帶來一些副作用,類對象之間的一致性需要維護。

​ 觀察者模式定義了一種交互,即發佈-訂閱:

  • 對象自身狀態的改變,需要通知相關協作的類對象,這些對象稱爲觀察者;
  • 作爲對通知的響應,相關的觀察者會對自身狀態做出一定更新,以同步系統中狀態的變化。

模式定義

​ 觀察者模式定義了一種對象間一對多的依賴關係,使得當每一個對象自身狀態發生改變時,相關的對象都將受到通知,並自身做出更新,以響應通知。

模式結構

  • Subject: 抽象目標對象;
  • ConcreteSubject: 目標對象,對象自身狀態改變時,將通知相關對象;
  • Observer: 抽象觀察者;
  • ConcreteObserver: 觀察者,接收通知並更新狀態。

Observer類圖

​ 以上是觀察者模式的類圖,就具體實現上來說,如果改成一下結構,實現起來會更加方便一點,下面也貼出我自己修改的類圖。
Observer修改版
​ 對於修改版,其中增加了Observable,負責維護訂閱對象的vector,當Subject狀態修改後,通知訂閱對象,Subject則僅需保存Observable的對象指針即可。

參考代碼

class Observer {
public:
    virtual void update(int new_state) = 0;
};

class ConcreteObserver : public Observer {
public:
    void update(int new_state) {
        observer_state_ = new_state;
    }

private:
    int observer_state_;
};

class Observable {
public:
    void attach(Observer *obp) {
        obv_.push_back(obp);
    }

    void detach(Observer *obp) {
        std::vector<Observer *>::iterator iter = std::find(obv_.begin(),
                                                     obv_.end(),
                                                     obp);
        obv_.erase(iter);

    }

    void update(int new_state) {
        for (int i = 0; i < obv_.size(); ++i) {
            obv_[i]->update(new_state);
        }
    }

private:
    std::vector<Observer *> obv_;
};

class Subject {
public:
    virtual void notify() = 0;

protected:
    Observable *obp_;
};

class ConcreteSubject : public Subject {
public:
    void notify() {
        obp_->update(state_);
    }

    int get_state() {
        return state_;
    }

    void set_state(int new_state) {
        state_ = new_state;
        notify();
    }

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