observe模式
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <cstdlib> 5 #include <map> 6 #include <list> 7 #include <algorithm> 8 using namespace std; 9 typedef string State; 10 11 class SecretaryBase; 12 //抽象观察者 13 class CObserverBase { 14 protected: 15 string name; 16 SecretaryBase* sub; 17 public: 18 CObserverBase(string strname, SecretaryBase* strsub) { 19 name = strname; 20 sub = strsub; 21 } 22 virtual void Update()=0; 23 }; 24 //具体的观察者,看股票的 25 class StockObserver: public CObserverBase { 26 public: 27 StockObserver(string strname, SecretaryBase* strsub) : 28 CObserverBase(strname, strsub) { 29 } 30 virtual void Update(); 31 }; 32 33 //具体观察者,看NBA的 34 class NBAObserver: public CObserverBase { 35 public: 36 NBAObserver(string strname, SecretaryBase* strsub) : 37 CObserverBase(strname, strsub) { 38 } 39 virtual void Update(); 40 }; 41 42 //抽象通知者 43 class SecretaryBase { 44 public: 45 string action; 46 vector<CObserverBase*> observers; 47 public: 48 virtual void Attach(CObserverBase* observer)=0; 49 virtual void Notify()=0; 50 }; 51 52 //具体通知者 53 class Secretary: public SecretaryBase { 54 public: 55 void Attach(CObserverBase* ob) { 56 observers.push_back(ob); 57 } 58 void Notify() { 59 vector<CObserverBase*>::iterator p = observers.begin(); 60 while (p != observers.end()) { 61 (*p)->Update(); 62 p++; 63 } 64 } 65 }; 66 67 void StockObserver::Update() { 68 cout << name << ":" << sub->action << ",不要玩股票了,要开始工作了" << endl; 69 } 70 void NBAObserver::Update() { 71 cout << name << ":" << sub->action << ",不要看NBA了,老板来了" << endl; 72 } 73 74 int main() { 75 SecretaryBase *p = new Secretary(); //创建观察者 76 77 //被观察的对象 78 CObserverBase *s1 = new NBAObserver("小李", p); 79 CObserverBase *s2 = new StockObserver("小赵", p); 80 //加入观察队列 81 p->Attach(s1); 82 p->Attach(s2); 83 //事件 84 p->action = "老板来了"; 85 //通知 86 p->Notify(); 87 88 return 0; 89 }