设计模式C++-观察者模式.docx
《设计模式C++-观察者模式.docx》由会员分享,可在线阅读,更多相关《设计模式C++-观察者模式.docx(14页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、观察者模式,又叫做发布-订阅(Publish/Subscribe)模式观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使得它们能够自动更新自己。观察者模式的动机将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的一致性。我们不希望为了维护一致性而使各类紧密耦合,这样会给维护、扩展和重用都带来不方便。而观察者模式的关键对象是主题Subject和观察者Observer,一个Subject可以有任意数目的依赖它的Observer,一旦Subject的状态发生了改变,所有的Observer都
2、可以得到通知。Subject发出通知时并不需要知道谁是它的观察者,也就是说,具体观察者是谁,它根本不需要知道。而任何一个具体观察者不知道也不需要知道其他观察者的存在。什么时候应该使用观察者模式当一个对象的改变需要同时改变其他对象的时候。而且它不知道具体有多少对象有待改变时,应该考虑使用观察者模式。也可以理解为,当一个抽象模型有两个方面,其中一方面依赖于另一方面,这时用观察者模式可以将这两者封装在独立的对象中使它们各自独立地改变和复用。总的来说,观察者模式所做的工作其实就是在解除耦合。让耦合的双方都依赖于抽象,而不是依赖于具体。从而使得各自的变化都不会影响另一边的变化。工程结构(1)抽象通知者S
3、ubject.h(2)抽象观察者Observer.h(3)具体通知者ConcreteSubject.h(4)具体观察者ConcreteObserver.h(5)客户端类ObserverApp.cpp(1)抽象通知者Subject.hview plaincopy to clipboardprint?/* * description: 主题或者抽象通知者类,一般用一个抽象类或者一个接口实现。 它把所有对观察者对象的引用保存在一个聚集里,每个主题都 可以有任何数量的观察者。抽象主题提供一个接口,可以增加 或者删除观察者对象。 * remark: */ #ifndef _SUBJECT_H_ #def
4、ine _SUBJECT_H_ #include Observer.h #include #include #include using namespace std; class CSubject public: / 增加观察者 virtual void Attach(CObserver* pObserver) = 0; / 移除观察者 virtual void Detach(CObserver* pObserver) = 0; / 通知 virtual void Notify(void) = 0; ; #endif _SUBJECT_H_ /* * description:主题或者抽象通知者
5、类,一般用一个抽象类或者一个接口实现。 它把所有对观察者对象的引用保存在一个聚集里,每个主题都 可以有任何数量的观察者。抽象主题提供一个接口,可以增加 或者删除观察者对象。 * remark:*/#ifndef _SUBJECT_H_#define _SUBJECT_H_#include Observer.h#include #include #include using namespace std;class CSubjectpublic: / 增加观察者 virtual void Attach(CObserver* pObserver) = 0; / 移除观察者 virtual void
6、Detach(CObserver* pObserver) = 0; / 通知 virtual void Notify(void) = 0; ;#endif _SUBJECT_H_ (2)抽象观察者Observer.hview plaincopy to clipboardprint?/* * description: 抽象观察者类,为所有的具体观察者定义一个接口,在得到主题 的通知时更新自己 * remark: */ #ifndef _OBSERVER_H_ #define _OBSERVER_H_ class CObserver public: virtual void Update() =
7、0; ; #endif _OBSERVER_H_ /* * description:抽象观察者类,为所有的具体观察者定义一个接口,在得到主题 的通知时更新自己 * remark:*/#ifndef _OBSERVER_H_#define _OBSERVER_H_class CObserverpublic: virtual void Update() = 0;#endif _OBSERVER_H_ (3)具体通知者ConcreteSubject.hview plaincopy to clipboardprint?/* * description: 具体主题类或者具体通知者,将有关状态存入具体观察
8、者对象;在 具体主题的内部状态改变时,给所有登记过的观察者发出通知。 * remark: */ #ifndef _CONCRETE_SUBJECT_H_ #define _CONCRETE_SUBJECT_H_ #include Subject.h class CConcreteSubject : public CSubject public: / 增加观察者 void Attach(CObserver* pObserver) m_listObservers.push_back(pObserver); / 移除观察者 void Detach(CObserver* pObserver) m_li
9、stObservers.remove(pObserver); / 通知 void Notify(void) list:iterator lIter; for (lIter = m_listObservers.begin(); lIter != m_listObservers.end(); lIter+) (*lIter)-Update(); void SetState(const string& strState) m_strSubjectState = strState; string GetState(void) return m_strSubjectState; private: str
10、ing m_strSubjectState; list m_listObservers; ; #endif _CONCRETE_SUBJECT_H_ /* * description:具体主题类或者具体通知者,将有关状态存入具体观察者对象;在 具体主题的内部状态改变时,给所有登记过的观察者发出通知。 * remark:*/#ifndef _CONCRETE_SUBJECT_H_#define _CONCRETE_SUBJECT_H_#include Subject.hclass CConcreteSubject : public CSubjectpublic: / 增加观察者 void Att
11、ach(CObserver* pObserver) m_listObservers.push_back(pObserver); / 移除观察者 void Detach(CObserver* pObserver) m_listObservers.remove(pObserver); / 通知 void Notify(void) list:iterator lIter; for (lIter = m_listObservers.begin(); lIter != m_listObservers.end(); lIter+) (*lIter)-Update(); void SetState(cons
12、t string& strState) m_strSubjectState = strState; string GetState(void) return m_strSubjectState; private: string m_strSubjectState; list m_listObservers;#endif _CONCRETE_SUBJECT_H_ (4)具体观察者ConcreteObserver.hview plaincopy to clipboardprint?/* * description: 具体观察者,实现抽象观察者角色所要求的更新接口,以便使本 身的状态与主题的状态相协
13、调。具体观察者角色可以保存一个指 向具体主题对象的引用 * remark: */ #ifndef _CONCRETE_OBSERVER_H_ #define _CONCRETE_OBSERVER_H_ #include ConcreteSubject.h class CConcreteObserver : public CObserver public: CConcreteObserver(CConcreteSubject* pSubject, const string& strName) m_pSubject = pSubject; m_strName = strName; void Upd
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 模式 观察者
限制150内