设计模式C++-观察者模式_第1页
设计模式C++-观察者模式_第2页
设计模式C++-观察者模式_第3页
免费预览已结束,剩余11页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、观看者模式,又叫做公布-订阅Publish/Subscribe模式观看者模式定义了一种一对多的依靠关系,让多个观看者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会 通知全部观看者对象,使得它们能够自动更自己。观看者模式的动机将一个系统分割成一系列相互协作的类有一个很不好的副作用,那就是需要维护相关对象间的全都性。我们不期望为了维护一 Subject 和观看者 Observer,Subject ObserverSubject Observer 都可以得到通知。Subject 发出通知时并不需要知道谁是它的观看者,也就是说,具体观看者是谁,它根本不需要知道。而任何一个具体观看者不知道

2、也 不需要知道其他观看者的存在。什么时候应当使用观看者模式当一个对象的转变需要同时转变其他对象的时候。而且它不知道具体有多少对象有待转变时,应当考虑使用观看者模式。也可 以理解为,当一个抽象模型有两个方面,其中一方面依靠于另一方面,这时用观看者模式可以将这两者封装在独立的对象中使 它们各自独立地转变和复用。总的来说,观看者模式所做的工作其实就是在解除耦合。让耦合的双方都依靠于抽象,而不是依 赖于具体。从而使得各自的变化都不会影响另一边的变化。工程构造Subject.hObserver.h具体通知者 ConcreteSubject.h具体观看者 ConcreteObserver.hObserve

3、rApp.cpp抽象通知者 Subject.h view plaincopy to clipboardprint?/*description: 主题或者抽象通知者类,一般用一个抽象类或者一个接口实现。它把全部对观看者对象的引用保存在一个聚拢里,每个主题都可以有任何数量的观看者。抽象主题供给一个接口,可以增加或者删除观看者对象。remark:*/ #ifndef_SUBJECT_H_#define _SUBJECT_H_#include “Observer.h“#include #include #include std;classCSubjectpublic:/ 增加观看者pObserver)

4、=0;/ 移除观看者pObserver)=0;/ 通知virtualvoidNotify(void)=0;#endif_SUBJECT_H_/*description:主题或者抽象通知者类,一般用一个抽象类或者一个接口实现。它把全部对观看者对象的引用保存在一个聚拢里,每个主题都可以有任何数量的观看者。抽象主题供给一个接口,可以增加或者删除观看者对象。remark:*/ #ifndef_SUBJECT_H_#define_SUBJECT_H_#include “Observer.h“#include #include #include std;classCSubjectpublic:/ 增加观看

5、者pObserver)=0;/ 移除观看者pObserver)=0;/ 通知virtualvoidNotify(void)=0;#endif_SUBJECT_H_Observer.hviewplaincopytoclipboardprint?/*description: 抽象观看者类,为全部的具体观看者定义一个接口,在得到主题的通知时更自己remark:*/ #ifndef_OBSERVER_H_#define_OBSERVER_H_classCObserverpublic:virtualvoidUpdate=0;#endif_OBSERVER_H_/*description:抽象观看者类,为

6、全部的具体观看者定义一个接口,在得到主题的通知时更自己remark:*/ #ifndef_OBSERVER_H_#define_OBSERVER_H_classCObserverpublic:virtualvoidUpdate=0;#endif_OBSERVER_H_具体通知者 ConcreteSubject.hviewplaincopytoclipboardprint?/*description: 具体主题类或者具体通知者,将有关状态存入具体观看者对象;在具体主题的内部状态转变时,给全部登记过的观看者发出通知。remark:*/ #ifndef_CONCRETE_SUBJECT_H_#inc

7、lude“Subject.h“:publicCSubjectpublic:/ 增加观看者pObserver)m_listObservers.push_back(pObserver);/ 移除观看者m_listObservers.remove(pObserver);/ 通知voidNotify(void)(*lIter)-Update;string&strState)m_strSubjectState=strState;stringGetState(void)private:stringm_strSubjectState; listm_listObservers;#endif_CONCRETE_

8、SUBJECT_H_/*description:具体主题类或者具体通知者,将有关状态存入具体观看者对象;在具体主题的内部状态转变时,给全部登记过的观看者发出通知。remark:*/ #ifndef_CONCRETE_SUBJECT_H_#include“Subject.h“:publicCSubjectpublic:/ 增加观看者pObserver)m_listObservers.push_back(pObserver);/ 移除观看者m_listObservers.remove(pObserver);/ 通知voidNotify(void)(*lIter)-Update;string&str

9、State)m_strSubjectState=strState;stringGetState(void)private:stringm_strSubjectState; listm_listObservers;#endif_CONCRETE_SUBJECT_H_具体观看者 ConcreteObserver.hviewplaincopytoclipboardprint?/*description: 具体观看者,实现抽象观看者角色所要求的更接口,以便使本身的状态与主题的状态相协调。具体观看者角色可以保存一个指向具体主题对象的引用remark:*/ #ifndef_CONCRETE_OBSERVE

10、R_H_#define _CONCRETE_OBSERVER_H_:publicCObserverpublic:CConcreteObserver(CConcreteSubject* pSubject, const string& strName)m_pSubject = pSubject; m_strName= strName;voidUpdate(void)if(NULL!=m_pSubject)m_strObserverState = m_pSubject-GetState;cout “观看者【“ m_strName “】的通知:“ m_strObserverState GetState

11、;cout “观看者【“ m_strName “】的通知:“ m_strObserverState Attach(pConcreteObserver1);pConcreteSubject-Attach(pConcreteObserver2); pConcreteSubject-Attach(pConcreteObserver3); pConcreteSubject-Detach(pConcreteObserver3); pConcreteSubject-SetState(“快休息“); pConcreteSubject-Notify;system(“pause“); FreeMemory(pC

12、oncreteObserver1); FreeMemory(pConcreteObserver2); FreeMemory(pConcreteObserver3); FreeMemory(pConcreteSubject);return0;/ ObserverApp.cpp : 定义把握台应用程序的入口点。#include“stdafx.h“#include “ConcreteSubject.h“ #include “ConcreteObserver.h“ void FreeMemory(void* Pointer)if(NULL!=Pointer)free(Pointer);int_tmai

13、n(intargc,_TCHAR*argv)CConcreteSubject* pConcreteSubject = NULL; pConcreteSubject = new CConcreteSubject; CConcreteObserver* pConcreteObserver1 = NULL;pConcreteObserver1 = new CConcreteObserver(pConcreteSubject, “Alice“);CConcreteObserver* pConcreteObserver2 = NULL;pConcreteObserver2 = new CConcrete

14、Observer(pConcreteSubject, “Bob“);CConcreteObserver*pConcreteObserver3=NULL;pConcreteObserver3 = new CConcreteObserver(pConcreteSubject, “Carey“);pConcreteSubject-Attach(pConcreteObserver1);pConcreteSubject-Attach(pConcreteObserver2); pConcreteSubject-Attach(pConcreteObserver3); pConcreteSubject-Det

15、ach(pConcreteObserver3); pConcreteSubject-SetState(“快休息“); pConcreteSubject-Notify;system(“pause“); FreeMemory(pConcreteObserver1); FreeMemory(pConcreteObserver2); FreeMemory(pConcreteObserver3); FreeMemory(pConcreteSubject);return0;观看者模式的缺乏尽管已经用了依靠倒转原则,但是“抽象通知者”还是依靠“抽象观看者知的功能就完成不了。另外每个具体观看者,它不肯定是“更

16、”的方法要调用。比方:我们的VS 开发工具,当我们调式程序时,期望是“工具箱”隐蔽就相互不知道,由客户端来打算通知谁。大事托付:托付就是一种引用方法的类型。一旦为托付安排了方法,托付将与该方法具有完全一样的行为。托付方法的使用可以像其他任 何方法一样,具有参数和返回值。托付可以看做是对函数的抽象,是函数的“类可以搭载多个方法,全部方法被依次唤起。可以使得托付对象所搭载的方法并不需要属于同一个类。托付对象所搭载的全部 方法必需具有一样的原型和形式,也就是拥有一样的参数列表和返回值类型。工程构造通知者类观看者类客户端类通知者类viewplaincopytoclipboardprint?/*desc

17、ription: 具体主题类或者具体通知者,将有关状态存入具体观看者对象;在具体主题的内部状态转变时,给全部登记过的观看者发出通知。remark:*/ #ifndef_CONCRETE_SUBJECT_H_#define _CONCRETE_SUBJECT_H_#includeusing namespace std;classObserver;classCSubjectpublic:void AddObserver(Observer* pOb, void (Observer:*pMemFunc)m_MapOb.insert(pair(pOb, pMemFunc);voidNotify(void

18、)ObIterIter=m_MapOb.begin;for(;Iter!=m_MapOb.end;Iter+)void (Observer:*pMemFunc) = Iter-second; (Iter-first-*pMemFunc);stringGetSubject(void)returnm_strSubject;strSubject)m_strSubject=strSubject;private:mapm_MapOb;typedef map:iterator ObIter; stringm_strSubject;#endif_CONCRETE_SUBJECT_H_/*descriptio

19、n:具体主题类或者具体通知者,将有关状态存入具体观看者对象;在具体主题的内部状态转变时,给全部登记过的观看者发出通知。remark:*/ #ifndef_CONCRETE_SUBJECT_H_#define _CONCRETE_SUBJECT_H_#includeusing namespace std;classObserver;classCSubjectpublic:void AddObserver(Observer* pOb, void (Observer:*pMemFunc)m_MapOb.insert(pair(pOb, pMemFunc);voidNotify(void)ObIter

20、Iter=m_MapOb.begin;for(;Iter!=m_MapOb.end;Iter+)void (Observer:*pMemFunc) = Iter-second; (Iter-first-*pMemFunc);stringGetSubject(void)returnm_strSubject;strSubject)m_strSubject=strSubject;private:mapm_MapOb;typedef map:iterator ObIter; stringm_strSubject;#endif_CONCRETE_SUBJECT_H_观看者类viewplaincopyto

21、clipboardprint?/*description:remark:*/ #ifndef_CONCRETE_OBSERVER_H_#define _CONCRETE_OBSERVER_H_ #include using namespace std;classObserver/donothing;classCSubject;classCObserverA:publicObserverpublic:CObserverA(const string& strName, CSubject* pSubject)m_strName= strName;m_pSubject=pSubject;if(NULL

22、!=m_pSubject)private:stringm_strName;CSubject*m_pSubject;classCObserverB:publicObserverpublic:m_strName= strName;m_pSubject=pSubject;if(NULL!=m_pSubject)private:stringm_strName;CSubject*m_pSubject;#endif_CONCRETE_OBSERVER_H_/*description:remark:*/ #ifndef_CONCRETE_OBSERVER_H_#define _CONCRETE_OBSERVER_H_#include using namespace std;classObserver/donothing;classCSubject;classCObserverA:publicObserverpublic:CObserverA(const string& strName, CSubject* pSubject)m_strName= strName;m_pSubject=pSubject;if(NULL!=m_pSubject)private:stringm_strName;CSubject*m_pS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论