#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++)