


版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030服裝面料項(xiàng)目可行性研究報(bào)告
- 農(nóng)業(yè)金屬工具標(biāo)準(zhǔn)化生產(chǎn)考核試卷
- 染整工藝在絲印染過程中的綠色生產(chǎn)模式探索考核試卷
- 2024-2025學(xué)年度部編版三年級(jí)語文在線教學(xué)計(jì)劃
- 企業(yè)員工餐飲保障及管理措施
- 初中語文教材使用計(jì)劃
- 九年級(jí)班主任學(xué)生個(gè)性發(fā)展計(jì)劃
- 小學(xué)數(shù)學(xué)教師信息技術(shù)應(yīng)用能力提升計(jì)劃
- 南通紅綠燈管道施工方案
- 中班健康飲食教育方案
- 不良資產(chǎn)盡職調(diào)查工作底稿表
- 社區(qū)獲得性肺炎教學(xué)演示課件
- 面部整骨培訓(xùn)課件
- 《論犯罪與刑罰》書評(píng)
- 熱固性聚苯板施工方案
- 馬工程版《中國經(jīng)濟(jì)史》各章思考題答題要點(diǎn)及詳解
- 統(tǒng)編版語文四年級(jí)下冊第四單元教材解讀解讀與集體備課課件
- 臺(tái)灣大學(xué)歐麗娟老師的中國文學(xué)史講義
- 存貨盤點(diǎn)安排通知盤點(diǎn)工作計(jì)劃書物資盤點(diǎn)計(jì)劃方案
- 客服電話服務(wù)標(biāo)準(zhǔn)
- 藥店保健食品管理制度
評(píng)論
0/150
提交評(píng)論