#include <iostream>
#include <list>
using namespace std;class Observer;class Subject { //抽象被觀察者
public:virtual void Attach(Observer*) = 0;virtual void Detach(Observer*) = 0;virtual void Notify() = 0;virtual int GetState() { return state_; }void SetState(int state) { state_ = state; }
protected:std::list<Observer*> observer_list_;int state_;
};class Observer { //抽象觀察者
public:Observer(Subject* sub) : p_subject_(sub) {}virtual void Update() = 0;
protected:Subject* p_subject_;
};class Observer1 : public Observer { //具體觀察者1
public:Observer1(Subject* p_subject) : Observer(p_subject) {}void Update() override{cout << "Observer1 get the update:" << p_subject_->GetState() << endl;}
};class Observer2 : public Observer //具體觀察者2
{
public:Observer2(Subject* p_subject) : Observer(p_subject) {}void Update() override{cout << "Observer2 get the update:" << p_subject_->GetState() << endl;}
};class ConcreteSubject : public Subject { //具體被觀察者
public:void Attach(Observer* pObserver) override{observer_list_.push_back(pObserver);}void Detach(Observer* pObserver) override{observer_list_.remove(pObserver);}void Notify() //核心操作:循環通知所有觀察者{auto it = observer_list_.begin();while (it != observer_list_.end()){(*it++)->Update();}}
};int main()
{Subject* p_subject = new ConcreteSubject(); // 創建被觀察者 Observer* p_observer1 = new Observer1(p_subject); // 創建觀察者Observer* p_observer2 = new Observer2(p_subject); // 創建觀察者 p_subject->SetState(2); // 改變狀態p_subject->Attach(p_observer1); // 注冊觀察者p_subject->Attach(p_observer2);p_subject->Notify();p_subject->Detach(p_observer1); // 注銷觀察值p_subject->SetState(3);p_subject->Notify();delete p_observer1;delete p_observer2;delete p_subject;
}
?
參考資料:
- Observer/Event觀察者模式(C++)
- 設計模式之觀察者模式(c++)