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 }
原文地址:https://www.cnblogs.com/kakamilan/p/2620278.html