#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;
}
参考资料: