大话设计模式C++版——观察者模式
2015-06-28 09:24
405 查看
观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式。
这里以大话设计模式中的例子为例,办公室员工A、B、C在看股票看电影,这时老板回来了,被A、B、C重金贿赂后的前台MM发出通知给A、B、C,A、B、C收到通知后赶紧关电脑,关股票窗口,装作在干活。
1、观察者接口
5、使用示例
我们在QQ聊天时,有时会电脑上挂一个QQ,然后手机上又挂一个,当收到朋友消息时,我们手机和电脑上的QQ都会同时收到同样的消息通知,这实际上就是观察者模式的典型运用,此时的消息就是一个被观察者的通知事件,而手机端和电脑端则是一个观察者对象,当然,这里的情况要稍微复杂些,需要匹配消息发送者和接受者的对象,决定哪些对象是否需要通知,不然一个人和妹子聊得激情四射的时候,就浑然不知在被现场直播中了。
这里以大话设计模式中的例子为例,办公室员工A、B、C在看股票看电影,这时老板回来了,被A、B、C重金贿赂后的前台MM发出通知给A、B、C,A、B、C收到通知后赶紧关电脑,关股票窗口,装作在干活。
1、观察者接口
class IObserver { public: virtual ~IObserver() {} virtual void OnEvent(TString tstrEvent) = 0; };2、具体观察者类
class CObserver : public IObserver { public: CObserver(TString tstrObserver) : m_tstrName(tstrObserver) {} virtual ~CObserver() {} virtual void OnEvent(TString tstrEvent) { _tprintf(_T("%s get %s event!!\n"), m_tstrName.c_str(), tstrEvent.c_str()); } private: TString m_tstrName; };3、被观察者类,由被观察者具体对象继承,有添加和删除观察者对象接口,当收到通知时挨个通知list中所有的观察者对象
class CBase_ObserveObject { public: CBase_ObserveObject() {} virtual ~CBase_ObserveObject() {} BOOL AddObserver(IObserver* poCObserver) { if (poCObserver) { m_listObserver.push_back(poCObserver); return TRUE; } return FALSE; } void DelObserver(IObserver* poCObserver) { m_listObserver.remove(poCObserver); } int Notify(TString tstrEvent) { if (!m_listObserver.empty()) { std::list<IObserver*>::iterator itObserer; for (itObserer = m_listObserver.begin(); itObserer != m_listObserver.end(); itObserer++) { IObserver* poObserver = *itObserer; poObserver->OnEvent(tstrEvent); } } return m_listObserver.size(); } private: std::list<IObserver*> m_listObserver; };4、被观察者具体对象,发出事件通知
class CBoss : public CBase_ObserveObject { public: void Come() { _tprintf("Boss: Ha Ha, boys, I come in\n"); Notify(_T("Boss Come")); }; void Leave() { _tprintf("Boss: Good bye, boys\n"); Notify(_T("Boss Leave")); } };
5、使用示例
void ObserveTest() { CObserver oCOberver1(_T("Viki")), oCOberver2(_T("Jim")); CBoss oCBoss; oCBoss.AddObserver(&oCOberver1); oCBoss.AddObserver(&oCOberver2); oCBoss.Come(); //删除oCOberver1观察者对象,这时当老板离开后,oCOberver1就收不到通知了 oCBoss.DelObserver(&oCOberver1); oCBoss.Leave(); }运行结果如下:
我们在QQ聊天时,有时会电脑上挂一个QQ,然后手机上又挂一个,当收到朋友消息时,我们手机和电脑上的QQ都会同时收到同样的消息通知,这实际上就是观察者模式的典型运用,此时的消息就是一个被观察者的通知事件,而手机端和电脑端则是一个观察者对象,当然,这里的情况要稍微复杂些,需要匹配消息发送者和接受者的对象,决定哪些对象是否需要通知,不然一个人和妹子聊得激情四射的时候,就浑然不知在被现场直播中了。
相关文章推荐
- 大话设计模式C++版——观察者模式
- C++类对象成员变量与成员函数内存分配问题
- C++类内存分布
- C++ Primer 学习笔记_56_ 类和数据抽象 --消息处理演示示例
- C++中智能指针的设计和使用
- 增强C++ 健壮性
- 对使用 C++ 异常处理应具有怎样的态度?
- c++ char_traits模板类的实现!!!
- C++引用与指针的比较
- C++ 异常
- C++ 异常的看法
- (转) C/C++中const关键字详解
- 八数码问题:C++广度搜索实现
- gcc编译C语言
- 栈的c语言实现
- c++ 专题一 函数的升级1
- leetcode 日经贴,Cpp code -Summary Ranges
- 【学习笔记】【C语言】结构体
- C++第三章、实验2
- OC基础语法-1.OC和C语言的对比