設(shè)計(jì)模式C++-觀察者模式_第1頁
設(shè)計(jì)模式C++-觀察者模式_第2頁
設(shè)計(jì)模式C++-觀察者模式_第3頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、觀看者模式,又叫做公布-訂閱Publish/Subscribe模式觀看者模式定義了一種一對多的依靠關(guān)系,讓多個(gè)觀看者對象同時(shí)監(jiān)聽某一個(gè)主題對象。這個(gè)主題對象在狀態(tài)發(fā)生變化時(shí),會(huì) 通知全部觀看者對象,使得它們能夠自動(dòng)更自己。觀看者模式的動(dòng)機(jī)將一個(gè)系統(tǒng)分割成一系列相互協(xié)作的類有一個(gè)很不好的副作用,那就是需要維護(hù)相關(guān)對象間的全都性。我們不期望為了維護(hù)一 Subject 和觀看者 Observer,Subject ObserverSubject Observer 都可以得到通知。Subject 發(fā)出通知時(shí)并不需要知道誰是它的觀看者,也就是說,具體觀看者是誰,它根本不需要知道。而任何一個(gè)具體觀看者不知道

2、也 不需要知道其他觀看者的存在。什么時(shí)候應(yīng)當(dāng)使用觀看者模式當(dāng)一個(gè)對象的轉(zhuǎn)變需要同時(shí)轉(zhuǎn)變其他對象的時(shí)候。而且它不知道具體有多少對象有待轉(zhuǎn)變時(shí),應(yīng)當(dāng)考慮使用觀看者模式。也可 以理解為,當(dāng)一個(gè)抽象模型有兩個(gè)方面,其中一方面依靠于另一方面,這時(shí)用觀看者模式可以將這兩者封裝在獨(dú)立的對象中使 它們各自獨(dú)立地轉(zhuǎn)變和復(fù)用??偟膩碚f,觀看者模式所做的工作其實(shí)就是在解除耦合。讓耦合的雙方都依靠于抽象,而不是依 賴于具體。從而使得各自的變化都不會(huì)影響另一邊的變化。工程構(gòu)造Subject.hObserver.h具體通知者 ConcreteSubject.h具體觀看者 ConcreteObserver.hObserve

3、rApp.cpp抽象通知者 Subject.h view plaincopy to clipboardprint?/*description: 主題或者抽象通知者類,一般用一個(gè)抽象類或者一個(gè)接口實(shí)現(xiàn)。它把全部對觀看者對象的引用保存在一個(gè)聚攏里,每個(gè)主題都可以有任何數(shù)量的觀看者。抽象主題供給一個(gè)接口,可以增加或者刪除觀看者對象。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:主題或者抽象通知者類,一般用一個(gè)抽象類或者一個(gè)接口實(shí)現(xiàn)。它把全部對觀看者對象的引用保存在一個(gè)聚攏里,每個(gè)主題都可以有任何數(shù)量的觀看者。抽象主題供給一個(gè)接口,可以增加或者刪除觀看者對象。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: 抽象觀看者類,為全部的具體觀看者定義一個(gè)接口,在得到主題的通知時(shí)更自己remark:*/ #ifndef_OBSERVER_H_#define_OBSERVER_H_classCObserverpublic:virtualvoidUpdate=0;#endif_OBSERVER_H_/*description:抽象觀看者類,為

6、全部的具體觀看者定義一個(gè)接口,在得到主題的通知時(shí)更自己remark:*/ #ifndef_OBSERVER_H_#define_OBSERVER_H_classCObserverpublic:virtualvoidUpdate=0;#endif_OBSERVER_H_具體通知者 ConcreteSubject.hviewplaincopytoclipboardprint?/*description: 具體主題類或者具體通知者,將有關(guān)狀態(tài)存入具體觀看者對象;在具體主題的內(nèi)部狀態(tài)轉(zhuǎn)變時(shí),給全部登記過的觀看者發(fā)出通知。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:具體主題類或者具體通知者,將有關(guān)狀態(tài)存入具體觀看者對象;在具體主題的內(nèi)部狀態(tài)轉(zhuǎn)變時(shí),給全部登記過的觀看者發(fā)出通知。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: 具體觀看者,實(shí)現(xiàn)抽象觀看者角色所要求的更接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。具體觀看者角色可以保存一個(gè)指向具體主題對象的引用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 : 定義把握臺(tái)應(yīng)用程序的入口點(diǎn)。#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;觀看者模式的缺乏盡管已經(jīng)用了依靠倒轉(zhuǎn)原則,但是“抽象通知者”還是依靠“抽象觀看者知的功能就完成不了。另外每個(gè)具體觀看者,它不肯定是“更

16、”的方法要調(diào)用。比方:我們的VS 開發(fā)工具,當(dāng)我們調(diào)式程序時(shí),期望是“工具箱”隱蔽就相互不知道,由客戶端來打算通知誰。大事托付:托付就是一種引用方法的類型。一旦為托付安排了方法,托付將與該方法具有完全一樣的行為。托付方法的使用可以像其他任 何方法一樣,具有參數(shù)和返回值。托付可以看做是對函數(shù)的抽象,是函數(shù)的“類可以搭載多個(gè)方法,全部方法被依次喚起??梢允沟猛懈秾ο笏钶d的方法并不需要屬于同一個(gè)類。托付對象所搭載的全部 方法必需具有一樣的原型和形式,也就是擁有一樣的參數(shù)列表和返回值類型。工程構(gòu)造通知者類觀看者類客戶端類通知者類viewplaincopytoclipboardprint?/*desc

17、ription: 具體主題類或者具體通知者,將有關(guān)狀態(tài)存入具體觀看者對象;在具體主題的內(nèi)部狀態(tài)轉(zhuǎn)變時(shí),給全部登記過的觀看者發(fā)出通知。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:具體主題類或者具體通知者,將有關(guān)狀態(tài)存入具體觀看者對象;在具體主題的內(nèi)部狀態(tài)轉(zhuǎn)變時(shí),給全部登記過的觀看者發(fā)出通知。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論