模式结构图:
代码示例:
#include <iostream> #include <string> #include <vector> #include <list> #include <windows.h> using namespace std; class IObserver { public: virtual void onNotify(int value) = 0; }; class INotifier { public: virtual void registerListenner(IObserver *obs) = 0; virtual void removeListenner(IObserver *obs) = 0; virtual void Notify() = 0; }; class MonitorNotifier : public INotifier { public: void registerListenner(IObserver *obs) { m_Listenners.push_back(obs); } void removeListenner(IObserver *obs) { list<IObserver*>::iterator it; for (it = m_Listenners.begin(); it != m_Listenners.end(); it++) { if (*it == obs) { m_Listenners.remove(obs); break; } } } void Notify() { list<IObserver*>::iterator it; for (it = m_Listenners.begin(); it != m_Listenners.end(); it++) { (*it)->onNotify(mValue); } } void setValue(int value) { mValue = value; Notify(); } private: list<IObserver*> m_Listenners; int mValue; }; class ZhangSan :public IObserver { public: void onNotify(int value) { stopCopyWork(value); } void stopCopyWork(int value) { cout << "zhangsan stopCopyWork + " << value << endl; } }; class LiSi :public IObserver { public: void onNotify(int value) { stopPlayGame(value); } void stopPlayGame(int value) { cout << "lisi stopPlayGame + " << value << endl; } }; int main() { cout << "Hello World1-------------" << endl; MonitorNotifier monitor; ZhangSan zs; LiSi ls; monitor.registerListenner(&zs); monitor.registerListenner(&ls); monitor.setValue(1); cout << "Hello World2-------------" << endl; monitor.removeListenner(&ls); monitor.setValue(2); return 0; }