观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
典型使用情况:某个对象掌握数据,当数据更新时通知多个对象更新显示(参考MVC)。
在java内置的Observer模式中支持“push”和“pull”两种方式,一般好像push更多一点,下面就以push为例:
UML图:
依然上一段测试代码:
#include <iostream> #include <algorithm> #include <list> using namespace std; class Observer { public: virtual void update(string str) = 0; }; class Subject { public: virtual void registerObserver(Observer*) = 0; virtual void removeObserver(Observer*) = 0; virtual void notifyObserver() = 0; }; // 显示数据接口 class Display { public: virtual void display() = 0; }; class SubjectImpl : public Subject { public: SubjectImpl(){ info = "123"; } void registerObserver(Observer* o){ observers.push_back(o); } void removeObserver(Observer* o) { list<Observer*>::iterator it = find(observers.begin(), observers.end(), o); if ( it != observers.end() ) observers.remove(o); } void notifyObserver(){ list<Observer*>::iterator it = observers.begin(); while(it != observers.end()) { (*it)->update(info); ++it; } } // 模拟数据发生改变 void dataChanged(){ info = "456"; notifyObserver(); } private: list<Observer*> observers; string info; }; class ObserverImpl : public Observer, public Display{ public: ObserverImpl(Subject* sub){ mySubject = sub; mySubject->registerObserver(this); } void update(string str) { data = str; display(); } void display() { cout << data << endl; } private: Subject* mySubject; string data; }; int main() { SubjectImpl *impl = new SubjectImpl(); ObserverImpl *obimpl = new ObserverImpl(impl); impl->dataChanged(); return 0; }
时间: 2024-10-11 11:56:56