版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、觀看者模式,又叫做公布-訂閱Publish/Subscribe模式觀看者模式定義了一種一對多的依靠關(guān)系,讓多個觀看者對象同時監(jiān)聽某一個主題對象。這個主題對象在狀態(tài)發(fā)生變化時,會 通知全部觀看者對象,使得它們能夠自動更自己。觀看者模式的動機將一個系統(tǒng)分割成一系列相互協(xié)作的類有一個很不好的副作用,那就是需要維護(hù)相關(guān)對象間的全都性。我們不期望為了維護(hù)一 Subject 和觀看者 Observer,Subject ObserverSubject Observer 都可以得到通知。Subject 發(fā)出通知時并不需要知道誰是它的觀看者,也就是說,具體觀看者是誰,它根本不需要知道。而任何一個具體觀看者不知道
2、也 不需要知道其他觀看者的存在。什么時候應(yīng)當(dāng)使用觀看者模式當(dāng)一個對象的轉(zhuǎn)變需要同時轉(zhuǎn)變其他對象的時候。而且它不知道具體有多少對象有待轉(zhuǎn)變時,應(yīng)當(dāng)考慮使用觀看者模式。也可 以理解為,當(dāng)一個抽象模型有兩個方面,其中一方面依靠于另一方面,這時用觀看者模式可以將這兩者封裝在獨立的對象中使 它們各自獨立地轉(zhuǎn)變和復(fù)用??偟膩碚f,觀看者模式所做的工作其實就是在解除耦合。讓耦合的雙方都依靠于抽象,而不是依 賴于具體。從而使得各自的變化都不會影響另一邊的變化。工程構(gòu)造Subject.hObserver.h具體通知者 ConcreteSubject.h具體觀看者 ConcreteObserver.hObserve
3、rApp.cpp抽象通知者 Subject.h view plaincopy to clipboardprint?/*description: 主題或者抽象通知者類,一般用一個抽象類或者一個接口實現(xiàn)。它把全部對觀看者對象的引用保存在一個聚攏里,每個主題都可以有任何數(shù)量的觀看者。抽象主題供給一個接口,可以增加或者刪除觀看者對象。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:主題或者抽象通知者類,一般用一個抽象類或者一個接口實現(xiàn)。它把全部對觀看者對象的引用保存在一個聚攏里,每個主題都可以有任何數(shù)量的觀看者。抽象主題供給一個接口,可以增加或者刪除觀看者對象。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: 具體主題類或者具體通知者,將有關(guān)狀態(tài)存入具體觀看者對象;在具體主題的內(nèi)部狀態(tài)轉(zhuǎn)變時,給全部登記過的觀看者發(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)變時,給全部登記過的觀看者發(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: 具體觀看者,實現(xiàn)抽象觀看者角色所要求的更接口,以便使本身的狀態(tài)與主題的狀態(tài)相協(xié)調(diào)。具體觀看者角色可以保存一個指向具體主題對象的引用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 : 定義把握臺應(yīng)用程序的入口點。#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)原則,但是“抽象通知者”還是依靠“抽象觀看者知的功能就完成不了。另外每個具體觀看者,它不肯定是“更
16、”的方法要調(diào)用。比方:我們的VS 開發(fā)工具,當(dāng)我們調(diào)式程序時,期望是“工具箱”隱蔽就相互不知道,由客戶端來打算通知誰。大事托付:托付就是一種引用方法的類型。一旦為托付安排了方法,托付將與該方法具有完全一樣的行為。托付方法的使用可以像其他任 何方法一樣,具有參數(shù)和返回值。托付可以看做是對函數(shù)的抽象,是函數(shù)的“類可以搭載多個方法,全部方法被依次喚起??梢允沟猛懈秾ο笏钶d的方法并不需要屬于同一個類。托付對象所搭載的全部 方法必需具有一樣的原型和形式,也就是擁有一樣的參數(shù)列表和返回值類型。工程構(gòu)造通知者類觀看者類客戶端類通知者類viewplaincopytoclipboardprint?/*desc
17、ription: 具體主題類或者具體通知者,將有關(guān)狀態(tài)存入具體觀看者對象;在具體主題的內(nèi)部狀態(tài)轉(zhuǎn)變時,給全部登記過的觀看者發(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)變時,給全部登記過的觀看者發(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 起點2025年7月全勤制度
- 警務(wù)站值班制度
- 民政執(zhí)法考試試題及答案
- 2026南平光澤縣不動產(chǎn)登記中心勞務(wù)派遣工作人員招聘2人備考考試題庫附答案解析
- 2026年上半年黑龍江省人民政府黑瞎子島建設(shè)和管理委員會事業(yè)單位公開招聘工作人員4人備考考試試題附答案解析
- 2026湖南智谷投資發(fā)展集團有限公司招聘18人參考考試題庫附答案解析
- 2026四川廣安市華鎣市委“兩新”工委、華鎣市級行業(yè)(綜合)黨委社會化選聘新興領(lǐng)域黨建工作專員6人參考考試試題附答案解析
- 2026普洱學(xué)院招聘碩士附以上12人備考考試試題附答案解析
- 2026廣西防城港市濱海中學(xué)春季學(xué)期臨聘教師招聘備考考試題庫附答案解析
- 2026年度青島平度市事業(yè)單位公開招聘工作人員(36人)參考考試試題附答案解析
- 四川省各地震抗震設(shè)防烈度信息一覽表
- 2025年郵政崗位考試題庫及答案
- 2025年國企計算機崗位筆試真題及答案
- DB51-T 3286-2025 公路泡沫輕質(zhì)土應(yīng)用技術(shù)規(guī)范
- 統(tǒng)編版2024八年級上冊道德與法治第一單元復(fù)習(xí)課件
- 園林綠化養(yǎng)護(hù)日志表模板
- 電池回收廠房建設(shè)方案(3篇)
- 《建筑工程定額與預(yù)算》課件(共八章)
- 鐵路貨運知識考核試卷含散堆裝等作業(yè)多知識點
- 幼兒游戲評價的可視化研究
- 跨區(qū)銷售管理辦法
評論
0/150
提交評論