大话设计模式C++版——观察者模式
来源:互联网 发布:mac放置文件 编辑:程序博客网 时间:2024/06/17 15:00
观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式。
这里以大话设计模式中的例子为例,办公室员工A、B、C在看股票看电影,这时老板回来了,被A、B、C重金贿赂后的前台MM发出通知给A、B、C,A、B、C收到通知后赶紧关电脑,关股票窗口,装作在干活。
1、观察者接口
这里以大话设计模式中的例子为例,办公室员工A、B、C在看股票看电影,这时老板回来了,被A、B、C重金贿赂后的前台MM发出通知给A、B、C,A、B、C收到通知后赶紧关电脑,关股票窗口,装作在干活。
1、观察者接口
class IObserver{public:virtual~IObserver() {}virtualvoidOnEvent(TString tstrEvent) = 0;};2、具体观察者类
class CObserver : public IObserver{public:CObserver(TString tstrObserver) : m_tstrName(tstrObserver) {}virtual~CObserver() {}virtualvoidOnEvent(TString tstrEvent){_tprintf(_T("%s get %s event!!\n"), m_tstrName.c_str(), tstrEvent.c_str());}private:TStringm_tstrName;};3、被观察者类,由被观察者具体对象继承,有添加和删除观察者对象接口,当收到通知时挨个通知list中所有的观察者对象
class CBase_ObserveObject{public:CBase_ObserveObject() {}virtual~CBase_ObserveObject() {}BOOLAddObserver(IObserver* poCObserver){if (poCObserver){m_listObserver.push_back(poCObserver);returnTRUE;}returnFALSE;}voidDelObserver(IObserver* poCObserver){m_listObserver.remove(poCObserver);}intNotify(TStringtstrEvent){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);}}returnm_listObserver.size();}private:std::list<IObserver*> m_listObserver;};4、被观察者具体对象,发出事件通知
class CBoss : public CBase_ObserveObject{public:voidCome(){_tprintf("Boss: Ha Ha, boys, I come in\n");Notify(_T("Boss Come"));};voidLeave(){_tprintf("Boss: Good bye, boys\n");Notify(_T("Boss Leave"));}};
5、使用示例
void ObserveTest(){CObserveroCOberver1(_T("Viki")), oCOberver2(_T("Jim"));CBossoCBoss;oCBoss.AddObserver(&oCOberver1);oCBoss.AddObserver(&oCOberver2);oCBoss.Come();//删除oCOberver1观察者对象,这时当老板离开后,oCOberver1就收不到通知了oCBoss.DelObserver(&oCOberver1);oCBoss.Leave();}运行结果如下:
我们在QQ聊天时,有时会电脑上挂一个QQ,然后手机上又挂一个,当收到朋友消息时,我们手机和电脑上的QQ都会同时收到同样的消息通知,这实际上就是观察者模式的典型运用,此时的消息就是一个被观察者的通知事件,而手机端和电脑端则是一个观察者对象,当然,这里的情况要稍微复杂些,需要匹配消息发送者和接受者的对象,决定哪些对象是否需要通知,不然一个人和妹子聊得激情四射的时候,就浑然不知在被现场直播中了。
0 0
- 【大话设计模式】——观察者模式
- 大话设计模式—观察者模式
- 大话设计模式C++版——观察者模式
- 大话设计-观察者模式
- 大话设计模式java版--观察者模式
- 大话设计模式java版:观察者模式
- 大话设计模式学习(十一)——观察者模式
- 大话设计模式——观察者模式(一)
- 大话设计模式——观察者模式(二)
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-观察者模式
- 大话设计模式-----观察者模式
- 大话设计模式----观察者模式
- 大话设计模式(Python版)--观察者模式
- 大话设计模式之观察者模式
- 【大话设计模式系列】之观察者模式
- 学习计划
- C++类内存分布
- SQL DML-数据查询
- Python 股票历史数据的获取
- C++类对象成员变量与成员函数内存分配问题
- 大话设计模式C++版——观察者模式
- 《程序员的自我修养》读书笔记4
- VS2012下创建使用.lib文件
- LeetCode | Contains Duplicate
- 安装nagios框架
- html 基础
- Java中的匿名内部类:由setOnClickListener说起
- SQLite数据库中的数据类型
- 基于Mahout的电影推荐系统