observe模式

本文介绍了一种使用C++实现的观察者模式,通过抽象观察者类和具体观察者类(如关注股市和NBA的观察者),配合抽象通知者及其实现的具体通知者类(秘书角色),展示了如何在代码中应用观察者模式。当特定事件发生时(例如老板的到来),所有注册的观察者都会收到通知并做出相应的行为改变。

 

 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/archive/2012/08/02/2620278.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值