Design Pattern --- Observer
// main.cc // #include <iostream> #include <vector> using namespace std; static int s_id = 0; class Observer; class Subject { // data. vector<Observer *> m_observers; public: virtual ~Subject(); public: // Interface. void addObserver(Observer *observer); void updateObservers(); }; class Observer { // data. Subject *m_subject = nullptr; int m_id = 0; public: Observer() : m_id(++s_id) {} public: // Interface. void addSubject(Subject *subject) { m_subject = subject; } void notify() { m_subject->updateObservers(); } void update() { cout <<m_id <<endl; } }; void Subject::addObserver(Observer *observer) {
// 不要忘记这里是双向链接, 即 Observer 链接 Subject, 同时 Subject 也链接 Observer. m_observers.push_back(observer); observer->addSubject(this); } void Subject::updateObservers() { for (auto i : m_observers) { i->update(); } } int main(int argc, char *argv[]) { Subject s; Observer x, y, z; s.addObserver(&x); s.addObserver(&y); s.addObserver(&z); // 观察者相互之间并不知道别人的存在. // 1. 每次一个观察者修改数据后, 告知 Subject, // 2. Subject 通知所有观察者进行更新. y.notify(); return 0; }
在多个视图关联到同一个数据源的时候, 就是该模式的实际体现.