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 }
时间: 2024-11-05 18:48:58