1. 程式人生 > >Design Patterns 19: Observer

Design Patterns 19: Observer

定義物件之間一對多的依賴性,當其中一個狀態發生變化的時候,通知並更新所有的依賴物件。

#include <list>

struct Subject;

struct Observer
{
    virtual void Update(Subject*) = 0;
};

struct ConcreteSubject;

struct ConcreteObserver : Observer
{
    void Update(Subject* subject) override;
private:
    int _observerState;
};

struct Subject
{
    void Attach(Observer* observer)
    {
        _observerList.push_back(observer);
    }

    void Detach(Observer* observer)
    {
        _observerList.remove(observer);
    }

    void Notify()
    {
        for (auto observer : _observerList)
            observer->Update(this);
    }

    virtual int GetState() = 0;
    virtual void SetState(int) = 0;
private:
    std::list<Observer*> _observerList;
};

struct ConcreteSubject : Subject
{
    int GetState() override { return _subjectState; }
    void SetState(int state) override { _subjectState = state; }
    ConcreteSubject(int state) : _subjectState(state) {}
    ConcreteSubject() = default;
private:
    int _subjectState;
};

void ConcreteObserver::Update(Subject* subject)
{
    _observerState = subject->GetState();
}

int main()
{
    ConcreteSubject subject;
    subject.Attach(new ConcreteObserver);
    subject.Attach(new ConcreteObserver);
    subject.Notify();
}