觀察者模式

觀察者模式

使用場景

當對象間存在一對多關係時,則使用觀察者模式(Observer Pattern)。比如,當一個對象被修改時,則會自動通知它的依賴對象。觀察者模式屬於行爲型模式。

觀察者模式結構圖

在觀察者模式中有如下角色:
- Subject : 被觀察者
- Observer : 抽象觀察者
- BinaryObserver : 具體觀察者

觀察者模式簡單實現

抽象觀察者(Observer)
裏面定義了一個更新方法:

class Observer
{
public:
    Observer();
    virtual void update() = 0;
    virtual ~Observer();
protected:
    Subject *m_subject;
};

具體觀察者(BinaryObserver)

class Observer
{
public:
    Observer();
    virtual void update() = 0;
    virtual ~Observer();
protected:
    Subject *m_subject;
};
class OctalObserver : public Observer
{
public:
    OctalObserver(Subject *subject);
    void update();
};
class HexaObserver : public Observer
{
public:
    HexaObserver(Subject *subject);
    void update();
};

具體被觀察者(Subject)

class Subject
{
public:
    Subject();    
    int getState() const;
    void setState(const int& state);
    void attach(Observer *observer);
    void notifAllObservers();
private:
    std::list<Observer* >m_observers;
    int m_state;
};

主函數調用

int main()
{
    Subject *subject = new Subject();
    Observer *observer_1 = new HexaObserver(subject);
    Observer *observer_2 = new OctalObserver(subject);
    Observer *observer_3 = new BinaryObserver(subject);

    cout << "First state change: 15" << endl;
    subject->setState(15);
    cout << endl << "Second state change: 10" << endl;
    subject->setState(10);

    delete observer_1;
    delete observer_2;
    delete observer_3;
    return 0;
}

結果

First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010

模式解析

此模式首先創建一個被觀察者對象 subject ,然後將此對象傳入觀察者對象中 observer_1 、 observer_2 、 observer_3,然後被觀察者對象 subject 在設置值的時候將會調用函數 notifAllObservers(),notifAllObservers 函數內部通過循環遍歷分別通知 觀察者。

源代碼下載

ObserverPattern.zip
免費獲取源碼通過郵箱聯繫我:[email protected]

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