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 }