首页 / C++ / C++ 实现设计模式之观察者模式
C++ 实现设计模式之观察者模式
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++ 实现设计模式之观察者模式,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4005字,纯文字阅读大概需要6分钟。
内容图文
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> 1011usingnamespace std; 12usingnamespace boost; 1314 typedef shared_ptr<BaseSubject> basesubject_t; 1516class BaseObserver //观察者基类 17{ 18protected : 19 std::string m_name; 20 basesubject_t m_sub; 2122public : 23 BaseObserver(); 24 BaseObserver(std::string name, basesubject_t sub); 25virtualvoid Update() 26 { 27 } 28}; 2930#endif
1 // file name : BaseObserver.cpp 2 3 #include "BaseObserver.h" 4 5BaseObserver::BaseObserver() 6{ 7 8} 910 BaseObserver::BaseObserver(std::string name, basesubject_t sub): m_name(name), m_sub(sub) 11{ 1213 }
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> 910usingnamespace std; 11usingnamespace boost; 1213class BaseObserver; 1415 typedef shared_ptr<BaseObserver> baseobserver_t; 1617class BaseSubject 18{ 1920private : 21 std::list<baseobserver_t> m_observers; 2223public : 24void Attach(baseobserver_t ob); 2526void Detach(BaseObserver* ob); 2728void Notify(); 2930public : 31string m_subject_state; 32}; 3334#endif
1 // file name BaseSubject.cpp 2 3 4 #include "BaseSubject.h" 5 #include "BaseObserver.h" 6 #include <iostream> 7 8 9void BaseSubject::Attach(baseobserver_t ob) 10{ 11 m_observers.push_back(ob); 12} 131415void BaseSubject::Detach(BaseObserver* ob) 16{ 1718} 1920void BaseSubject::Notify() 21{ 22for(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"1112usingnamespace std; 13usingnamespace boost; 1415class Secretary : public BaseSubject 16{ 1718}; 1920class Boss : public BaseSubject 21{ 2223}; 2425class StockObserver : public BaseObserver 26{ 27public : 28 StockObserver(string name, basesubject_t sub) : BaseObserver(name, sub) 29 { 3031 } 3233void CloseStock() 34 { 35 cout<<m_sub->m_subject_state<<m_name<<" 关闭CloseStock"<<endl; 36 } 3738void Update() 39 { 40 CloseStock(); 41 } 42}; 4344class NBAObserver : public BaseObserver 45{ 46public : 47 NBAObserver(string name, basesubject_t sub): BaseObserver(name, sub) 48 { 49 } 5051void Update() 52 { 53 CloseNBA(); 54 } 5556void CloseNBA() 57 { 58 cout<<m_sub->m_subject_state<<m_name<<" 关闭NBA"<<endl; 59 } 60}; 6162 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; 6667int 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)); 7374 may->m_subject_state = "老板回来啦! "; 75 may->Attach(neo); 76 may->Attach(jason); 7778 (*may).Notify(); 798081/*82 boss->m_subject_state = "老板回来啦! "; 83 boss->Attach(neo); 84 boss->Attach(jason); 85*/86 (*boss).Notify(); 8788return0; 89 }
原文:http://www.cnblogs.com/firemage/p/4809632.html
内容总结
以上是互联网集市为您收集整理的C++ 实现设计模式之观察者模式全部内容,希望文章能够帮你解决C++ 实现设计模式之观察者模式所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。