码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 实现设计模式之观察者模式

时间:2015-09-15 12:20:04      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:

1. 什么是观察者模式?

  观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

 

2. 有什么用?

  观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。例如: 游戏里,当玩家触发 Attack ,界面的一系列变化:角色攻击动画播放,怪物倒地,伤害量计算与显示。这些变化都基于玩家 attack 动作。 而这些变化是可以无限扩展的。

3. 程序示例代码

  本程序简单实现了公司里面的一个场景。一群偷懒的员工(observer)趁老板不在,偷偷做自己的私事。不用担心被老板捉到,他们早已通知门口的前台 May(subject),当老板回来后,立马通知他们。一下是本程序的全部代码, linux 下编译运行正常, 注意 本程序用到了 boost库的 shared_ptr 。需要安装Boost库才能正常运行。

 1 //file name : BaseObserver.h
 2 
 3 #ifndef __BASE_OBSERVER_H__
 4 #define __BASE_OBSERVER_H__
 5 
 6 #include <string>
 7 
 8 #include "BaseSubject.h"
 9 #include <boost/shared_ptr.hpp>
10 
11 using namespace std;
12 using namespace boost;
13 
14 typedef shared_ptr<BaseSubject> basesubject_t;
15 
16 class BaseObserver    //观察者基类 
17 {
18     protected :
19         std::string m_name;
20         basesubject_t m_sub;
21 
22     public :
23         BaseObserver();
24         BaseObserver(std::string name, basesubject_t sub);
25         virtual void Update()
26         {
27         }
28 };
29 
30 #endif
 1 //file name : BaseObserver.cpp
 2 
 3 #include "BaseObserver.h"
 4 
 5 BaseObserver::BaseObserver()
 6 {
 7 
 8 }
 9 
10 BaseObserver::BaseObserver(std::string name, basesubject_t sub):  m_name(name), m_sub(sub)
11 {
12     
13 }
 1 //file name BaseSubject.h
 2 
 3 #ifndef __BASE_SUBJECT_H__
 4 #define __BASE_SUBJECT_H__
 5 
 6 #include <list>
 7 #include <string>
 8 #include <boost/shared_ptr.hpp>
 9 
10 using namespace std;
11 using namespace boost;
12 
13 class BaseObserver;
14 
15 typedef shared_ptr<BaseObserver> baseobserver_t;
16 
17 class BaseSubject
18 {
19    
20     private :
21         std::list<baseobserver_t> m_observers;
22 
23     public :
24         void Attach(baseobserver_t ob);
25 
26         void Detach(BaseObserver* ob);
27         
28         void Notify();
29 
30     public : 
31         string m_subject_state;
32 };
33 
34 #endif
 1 //file name BaseSubject.cpp
 2 
 3 
 4 #include "BaseSubject.h"
 5 #include "BaseObserver.h"
 6 #include <iostream>
 7 
 8 
 9 void BaseSubject::Attach(baseobserver_t ob)
10 {
11     m_observers.push_back(ob);
12 }
13 
14 
15 void BaseSubject::Detach(BaseObserver* ob)
16 {
17     
18 }
19 
20 void BaseSubject::Notify()
21 {
22     for(std::list<baseobserver_t>::const_iterator it = m_observers.begin(); it != m_observers.end(); ++it)
23     {   
24        (*it)->Update();
25     }    
26 }
 1 //file name: bossSecretaryWorkers.cpp
 2 
 3 #include <ostream>
 4 #include <list>
 5 #include <string>
 6 
 7 #include "boost/shared_ptr.hpp"
 8 
 9 #include "BaseObserver.h"
10 #include "BaseSubject.h"
11 
12 using namespace std;
13 using namespace boost;
14 
15 class Secretary : public BaseSubject
16 {
17 
18 };
19 
20 class Boss : public BaseSubject
21 {
22 
23 };
24 
25 class StockObserver : public BaseObserver
26 {
27     public :
28        StockObserver(string name, basesubject_t sub) : BaseObserver(name, sub)
29         {
30             
31         }
32         
33        void CloseStock()
34         {
35             cout<<m_sub->m_subject_state<<m_name<<" 关闭CloseStock"<<endl;
36         }
37         
38         void Update()
39         {
40             CloseStock();
41         }
42 };
43 
44 class NBAObserver : public BaseObserver
45 {
46     public :
47        NBAObserver(string name, basesubject_t sub): BaseObserver(name, sub)
48         {  
49         }
50         
51         void Update()
52         {
53             CloseNBA();
54         }
55         
56         void CloseNBA()
57         {
58             cout<<m_sub->m_subject_state<<m_name<<" 关闭NBA"<<endl;
59         }
60 };
61 
62 typedef shared_ptr<Boss> boss_t;
63 typedef shared_ptr<Secretary> secretary_t;
64 typedef shared_ptr<StockObserver> stockobserver_t;
65 typedef shared_ptr<NBAObserver> nbaobserver_t;
66 
67 int main(int argc, char** argv)
68 {
69     boss_t boss(new Boss());
70     secretary_t may(new Secretary());
71     stockobserver_t neo(new StockObserver("neo", may));
72     nbaobserver_t jason(new NBAObserver("jason", may));
73     
74     may->m_subject_state = "老板回来啦! ";
75     may->Attach(neo);
76     may->Attach(jason);
77     
78     (*may).Notify();
79     
80     
81 /*  
82    boss->m_subject_state = "老板回来啦! ";
83     boss->Attach(neo);
84     boss->Attach(jason);
85 */    
86     (*boss).Notify();
87 
88     return 0;
89 }

 

C++ 实现设计模式之观察者模式

标签:

原文地址:http://www.cnblogs.com/firemage/p/4809632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!