面向?qū)ο蠓椒ㄅc技術(shù)課件:設(shè)計(jì)模式實(shí)踐_第1頁
面向?qū)ο蠓椒ㄅc技術(shù)課件:設(shè)計(jì)模式實(shí)踐_第2頁
面向?qū)ο蠓椒ㄅc技術(shù)課件:設(shè)計(jì)模式實(shí)踐_第3頁
面向?qū)ο蠓椒ㄅc技術(shù)課件:設(shè)計(jì)模式實(shí)踐_第4頁
面向?qū)ο蠓椒ㄅc技術(shù)課件:設(shè)計(jì)模式實(shí)踐_第5頁
已閱讀5頁,還剩71頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

面向?qū)ο蟮募夹g(shù)與方法共69頁第2頁P(yáng)roxy模式目的為其他對象提供一種代理以控制對這個對象的訪問。說白了就是,在一些情況下客戶不想或者不能直接引用一個對象,而代理對象可以在客戶和目標(biāo)對象之間起到中介作用,去掉客戶不能看到的內(nèi)容和服務(wù)或者增添客戶需要的額外服務(wù)。共69頁第3頁P(yáng)roxy模式問題:對于每一個開銷很大的對象,應(yīng)該根據(jù)需要進(jìn)行創(chuàng)建,當(dāng)一個圖像變?yōu)榭梢姇r會產(chǎn)生這樣的需要。但是在文檔中我們用什么來代替這個圖像呢?我們又如何才能隱藏根據(jù)需要創(chuàng)建圖像這一事實(shí),從而不會使得編輯器的實(shí)現(xiàn)復(fù)雜化呢?共69頁第4頁P(yáng)roxy模式問題的解決方案是使用另一個對象,即圖像Proxy,替代那個真正的圖像。Proxy可以代替一個圖像對象,并且在需要時負(fù)責(zé)實(shí)例化這個圖像對象。共69頁第5頁P(yáng)roxy模式結(jié)構(gòu)圖共69頁第6頁P(yáng)roxy模式分類:1)遠(yuǎn)程代理(RemoteProxy)為一個對象在不同的地址空間提供局部代表。2)虛代理(VirtualProxy)根據(jù)需要將一個資源消耗很大或者比較復(fù)雜的對象延遲的真正需要時才創(chuàng)建。3)保護(hù)代理(ProtectionProxy)控制對原始對象的訪問。共69頁第7頁P(yáng)roxy模式4)智能引用(SmartReference)代理,當(dāng)一個對象被引用時,提供一些額外的操作,比如將對此對象調(diào)用的次數(shù)記錄下來等。共69頁第8頁P(yáng)roxy模式結(jié)構(gòu)共69頁第9頁P(yáng)roxy模式運(yùn)行時刻一種可能的代理結(jié)構(gòu)的對象圖。共69頁第10頁P(yáng)roxy模式舉例:簡單的論壇的權(quán)限管理—發(fā)貼功能聲明了真實(shí)對象和代理對象的共同接口:classMyForum{

public:virtualvoidAddFile()=0;

}

共69頁第11頁P(yáng)roxy模式代理對象類:classMyForumProxy:publicMyForum{

private:RealMyForum*forum;

intpermission;//權(quán)限值

public:MyForumProxy(intpermission)

{

forum=newRealMyForum()

this->permission=permission;

}

共69頁第12頁P(yáng)roxy模式

voidAddFile()//實(shí)現(xiàn)的接口

{

//滿足權(quán)限設(shè)置的時候才能夠執(zhí)行操作

if(“registered”==permission)

{

forum->AddFile();

}

else

cout<<"YouarenotalegaluserofMyForum,pleaseregister!";

}

};共69頁第13頁P(yáng)roxy模式實(shí)體對象類:classMyForumProxy:publicMyForum{

voidAddFile()//實(shí)現(xiàn)的接口

{

//實(shí)現(xiàn)發(fā)貼功能

}

};共69頁第14頁P(yáng)roxy模式說明:為其他對象提供一種代理以控制對這個對象的訪問。也就是說當(dāng)我們不能直接訪問我們想訪問的對象時,必須通過一個代理對象來訪問。共69頁第15頁P(yáng)roxy模式proxy模式與adapter模式關(guān)系:都是為一個對象提供一種前置的接口。但是,變壓器模式的用意是要改變所考慮的對象的接口;而代理模式并不能改變所代理的對象的接口,在這一點(diǎn)上兩個模式有明顯的區(qū)別。共69頁第16頁Mediator模式問題:

面向?qū)ο笤O(shè)計(jì)鼓勵將行為分布到各個對象中。這種分布可能會導(dǎo)致對象間有許多連接。在最壞的情況下,每一個對象都知道其他所有對象。共69頁第17頁Mediator模式目的:用一個中介對象來封裝一系列的對象交互。中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互。共69頁第18頁Mediator模式可以通過將集體行為封裝在一個單獨(dú)的中介者(mediator)對象中以避免這個問題。中介者負(fù)責(zé)控制和協(xié)調(diào)一組對象間的交互。中介者充當(dāng)一個中介以使組中的對象不再相互顯式引用。這些對象僅知道中介者,從而減少了相互連接的數(shù)目。共69頁第19頁Mediator模式例如,一個圖形用戶界面中對話框的實(shí)現(xiàn)共69頁第20頁Mediator模式FontDialogDirector可作為一個對話框中的窗口組件間的中介者。共69頁第21頁Mediator模式交互圖說明了各對象如何協(xié)作處理一個列表框中選項(xiàng)的變化。共69頁第22頁Mediator模式FontDialogDirector抽象怎樣被集成到一個類庫中,如下圖所示:共69頁第23頁Mediator模式結(jié)構(gòu)共69頁第24頁Mediator模式一個典型的對象結(jié)構(gòu)可能如下圖所示:共69頁第25頁代碼示例抽象類DialogDirector為導(dǎo)控者定義了一個接口。共69頁第26頁Widget是窗口組件的抽象基類。一個窗口組件知道它的導(dǎo)控者。共69頁第27頁Changed調(diào)用導(dǎo)控者的WidgetChanged操作。通知導(dǎo)控者某個重要事件發(fā)生了。共69頁第28頁ListBox、EntryField和Button是Widget的子類,用作特定的用戶界面構(gòu)成元素。ListBox提供了一個GetSelection操作來得到當(dāng)前的選擇項(xiàng),而EntryField的SetText操作則將新的正文放入該域中。共69頁第29頁共69頁第30頁Button是一個簡單的窗口組件,它一旦被按下就調(diào)用Changed。這是在其HandleMouse的實(shí)現(xiàn)中完成的:共69頁第31頁FontDialogDirectator類在對話框中的窗口組件間進(jìn)行中介。FontDialogDirectator是

DialogDirectator的子類:共69頁第32頁FontDialogDirectator跟蹤它顯示的窗口組件。它重定義CreateWidgets以創(chuàng)建窗口組件并初始化對它們的引用:共69頁第33頁WidgetChanged保證窗口組件正確地協(xié)同工作:共69頁第34頁Mediator模式效果1)它將各Colleague解耦2)它簡化了對象協(xié)議3)它對對象如何協(xié)作進(jìn)行了抽象4)它使控制集中化,集中的優(yōu)點(diǎn)就是便于管理,也正是符合了OO設(shè)計(jì)中的每個類的職責(zé)要單一和集中的原則。共69頁第35頁Mediator模式總結(jié)說明:定義:用一個中介對象來封裝一系列的對象交互特點(diǎn):中介者使各對象不需要顯式地相互引用,從而使其耦合松散,而且可以獨(dú)立地改變它們之間的交互好處:降低復(fù)雜度.所有對象都只和Mediator中介者單線聯(lián)系.而中介者隱式的包含了對象之間的關(guān)系使原本多對多的關(guān)系變成1對多關(guān)系共69頁第36頁Mediator模式總結(jié)用途:主要用于簡化以下類型的系統(tǒng):

1、有多個對象

2、多個對象之間有著復(fù)雜的聯(lián)系

Mediator模式在事件驅(qū)動類應(yīng)用中比較多,例如界面設(shè)計(jì)GUI.;聊天,消息傳遞等,在聊天應(yīng)用中,需要有一個MessageMediator,專門負(fù)責(zé)request/response之間任務(wù)的調(diào)節(jié).共69頁第37頁Observe模式示例:共69頁第38頁Observe模式目的:定義對象間的一種一對多的依賴關(guān)系,當(dāng)一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新。共69頁第39頁Observe模式Observer的一個實(shí)例:

Model/View/Control(MVC)

實(shí)現(xiàn)了業(yè)務(wù)邏輯和表示層的解耦MFC中,Doc/View(文檔視圖結(jié)構(gòu))提供了實(shí)現(xiàn)MVC的框架結(jié)構(gòu)在Java陣容中,Struts則提供了實(shí)現(xiàn)MVC的框架結(jié)構(gòu)共69頁第40頁Observe模式結(jié)構(gòu):共69頁第41頁Observe模式交互圖共69頁第42頁Observe模式示例:實(shí)現(xiàn)時間的兩種顯示一個抽象類定義了Observer接口:共69頁第43頁Observe模式一個抽象類定義了Subject接口:共69頁第44頁Observe模式共69頁第45頁Observe模式ClockTimer提供了一個接口用于取出單個的時間單位如小時,分鐘,和秒。共69頁第46頁Observe模式Tick操作由一個內(nèi)部計(jì)時器以固定的時間間隔調(diào)用,從而提供一個精確的時間基準(zhǔn)。Tick更新ClockTimer的內(nèi)部狀態(tài)并調(diào)用Notify通知觀察者:共69頁第47頁Observe模式現(xiàn)在我們可以定義一個DigitalClock類來顯示時間。它從一個用戶界面工具箱提供的Widget類繼承了它的圖形功能。通過繼承Observer,Observer接口被融入DigitalClock的接口。共69頁第48頁Observe模式共69頁第49頁Observe模式共69頁第50頁Observe模式共69頁第51頁Observe模式共69頁第52頁Observe模式一個AnalogClock可用相同的方法定義共69頁第53頁Observe模式測試代碼:共69頁第54頁Observe模式

在Java語言中還提供了專門的接口實(shí)現(xiàn)Observer模式:通過專門的類Observable及Observer接口來實(shí)現(xiàn)MVC編程模式,其UML圖可以表示為:共69頁第55頁Observe模式共69頁第56頁Strategy模式目的定義一系列的算法,把它們一個個封裝起來,并且使它們可相互替換。本模式使得算法可獨(dú)立于使用它的客戶而變化。給業(yè)務(wù)邏輯(算法)具體實(shí)現(xiàn)和抽象接口之間的解耦。共69頁第57頁適用性許多相關(guān)的類僅僅是行為有異。需要使用一個算法的不同變體。算法使用客戶不應(yīng)該知道的數(shù)據(jù)。一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn)。Strategy模式共69頁第58頁結(jié)構(gòu)Strategy模式共69頁第59頁Strategy模式示例:實(shí)現(xiàn)從鍵盤讀入字符并輸出打印的程序。CopyReadKeyboardWritePrinter共69頁第60頁Strategy模式Copy程序voidCopy(){intc;while((c=RdKbd()!=EOF))WrtPrt(c);}共69頁第61頁Strategy模式需求在變化

希望Copy程序能從紙帶讀入機(jī)中讀入信息。該如何響應(yīng)此變化?給Copy函數(shù)添加boolean參數(shù)變量?若是,則會帶來大量其他調(diào)用Copy函數(shù)的地方的改變。共69頁第62頁Strategy模式保持接口不變,修改結(jié)果:BoolptFlag=false;//remembertoresetthisflagvoidCopy(){intc;while((c=(ptFlag?Rdpt():RdKbd()))!=EOF))WrtPrt(c);}共69頁第63頁Strategy模式得寸進(jìn)尺希望Copy程序可以輸出到紙帶穿孔機(jī)上。

又該怎么辦呢?共69頁第64頁Strategy模式boolptFlag=false;//remembertoresetthisflagboolpunchFlag=false;//remembertoresetthisflagvoidCopy(){intc;while((c=(ptFlag?Rdpt():RdKbd()))!=EOF))punchFlag?WrtPunch(c):WrtPrt(c);}共69頁第65頁Strategy模式如果再有新的需求變化又該如何???采用Strategy模式對問題進(jìn)行重新設(shè)計(jì)共69頁第66頁Strategy模式classReader{ public:virtualintread()=0;};classKeyboardReader:publicReader{ public:virtua

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論