第16章 代理模式_第1頁(yè)
第16章 代理模式_第2頁(yè)
第16章 代理模式_第3頁(yè)
第16章 代理模式_第4頁(yè)
第16章 代理模式_第5頁(yè)
已閱讀5頁(yè),還剩30頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第16章代理模式劉劉 偉偉.本章教學(xué)內(nèi)容w 代理模式 模式動(dòng)機(jī)與定義模式動(dòng)機(jī)與定義 模式結(jié)構(gòu)與分析模式結(jié)構(gòu)與分析 模式實(shí)例與解析模式實(shí)例與解析 模式效果與應(yīng)用模式效果與應(yīng)用 模式擴(kuò)展模式擴(kuò)展.代理模式w模式動(dòng)機(jī)在某些情況下,在某些情況下,一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)一個(gè)客戶不想或者不能直接引用一個(gè)對(duì)象,此時(shí)可以通過(guò)一個(gè)稱之為象,此時(shí)可以通過(guò)一個(gè)稱之為“代理代理”的第三者來(lái)實(shí)現(xiàn)的第三者來(lái)實(shí)現(xiàn)間接引用間接引用。代理對(duì)象可以。代理對(duì)象可以在客戶端和目標(biāo)對(duì)象之間起到在客戶端和目標(biāo)對(duì)象之間起到中介的作用中介的作用,并且可以,并且可以通過(guò)代理對(duì)象去掉客戶不能看到通過(guò)代理對(duì)象去掉客戶不能看到的內(nèi)容和服

2、務(wù)或者添加客戶需要的額外服務(wù)的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)。.代理模式w模式動(dòng)機(jī).代理模式w模式動(dòng)機(jī).代理模式w模式動(dòng)機(jī)通過(guò)通過(guò)引入一個(gè)新的對(duì)象引入一個(gè)新的對(duì)象(如小圖片和遠(yuǎn)程代理(如小圖片和遠(yuǎn)程代理對(duì)象)對(duì)象)來(lái)實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)來(lái)實(shí)現(xiàn)對(duì)真實(shí)對(duì)象的操作或者將新的對(duì)象作為真實(shí)對(duì)象的一個(gè)替身象作為真實(shí)對(duì)象的一個(gè)替身,這種實(shí)現(xiàn)機(jī)制即,這種實(shí)現(xiàn)機(jī)制即為代理模式,為代理模式,通過(guò)引入代理對(duì)象來(lái)間接訪問(wèn)一通過(guò)引入代理對(duì)象來(lái)間接訪問(wèn)一個(gè)對(duì)象個(gè)對(duì)象,這就是代理模式的模式動(dòng)機(jī)。,這就是代理模式的模式動(dòng)機(jī)。 .代理模式w 模式定義代理模式代理模式(Proxy Pattern) :給某一個(gè)對(duì)

3、象:給某一個(gè)對(duì)象提供一個(gè)代提供一個(gè)代理理,并,并由代理對(duì)象控制對(duì)原對(duì)象的引用由代理對(duì)象控制對(duì)原對(duì)象的引用。代理模式的英。代理模式的英文叫做文叫做Proxy或或Surrogate,它是一種,它是一種對(duì)象結(jié)構(gòu)型模式對(duì)象結(jié)構(gòu)型模式。.代理模式w 模式定義Proxy Pattern: Provide a surrogate or placeholder for another object to control access to it. Frequency of use: medium high .代理模式w 模式結(jié)構(gòu)preRequest();realSubject.request();postRe

4、quest();realSubjectSubject+ request ().Proxy- realSubject : RealSubject+preRequest ()request ()postRequest ().RealSubject+ request ().Client.代理模式w 模式結(jié)構(gòu)代理模式包含如下角色:代理模式包含如下角色: Subject: 抽象主題角色 Proxy: 代理主題角色 RealSubject: 真實(shí)主題角色.代理模式w 模式分析 代理模式示意結(jié)構(gòu)圖比較簡(jiǎn)單,一般可以簡(jiǎn)化為如下圖所示,但代理模式示意結(jié)構(gòu)圖比較簡(jiǎn)單,一般可以簡(jiǎn)化為如下圖所示,但是在現(xiàn)實(shí)中要復(fù)雜很

5、多。是在現(xiàn)實(shí)中要復(fù)雜很多。接口代理類(lèi)實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)實(shí)現(xiàn)調(diào)用.代理模式w 模式分析 典型的代理類(lèi)實(shí)現(xiàn)代碼:典型的代理類(lèi)實(shí)現(xiàn)代碼:public class Proxy implements Subject private RealSubject realSubject = new RealSubject(); public void preRequest() . public void request() preRequest(); realSubject.request(); postRequest(); public void postRequest() .代理模式w 代理模式實(shí)例與解析實(shí)例一:論

6、壇權(quán)限控制代理實(shí)例一:論壇權(quán)限控制代理 在一個(gè)論壇中已注冊(cè)用戶和游客的權(quán)限不同,已注冊(cè)的用戶擁有發(fā)帖、修改自己的注冊(cè)信息、修改自己的帖子等功能;而游客只能看到別人發(fā)的帖子,沒(méi)有其他權(quán)限。使用代理模式來(lái)設(shè)計(jì)該權(quán)限管理模塊。 在本實(shí)例中我們使用代理模式中的保護(hù)代理,該代理用于控制對(duì)一個(gè)對(duì)象的訪問(wèn),可以給不同的用戶提供不同級(jí)別的使用權(quán)限。.代理模式w 代理模式實(shí)例與解析實(shí)例一:論壇權(quán)限控制代理實(shí)例一:論壇權(quán)限控制代理 permissionPermissionProxy-permissionlevel: RealPermission: int = new RealPermission() = 0+mo

7、difyUserInfo ()viewNote ()publishNote ()modifyNote ()setLevel (int level): void: void: void: void: voidRealPermission+modifyUserInfo ()viewNote ()publishNote ()modifyNote ()setLevel (int level).: void: void: void: void: voidAbstractPermission+modifyUserInfo ()viewNote ()publishNote ()modifyNote ()se

8、tLevel (int level): void: void: void: void: voidClient.代理模式w 代理模式實(shí)例與解析實(shí)例一:論壇權(quán)限控制代理實(shí)例一:論壇權(quán)限控制代理 參考代碼 (Chapter 16 Proxysample01)演示演示.代理模式w 代理模式實(shí)例與解析實(shí)例二:數(shù)學(xué)運(yùn)算代理實(shí)例二:數(shù)學(xué)運(yùn)算代理 模擬應(yīng)用遠(yuǎn)程代理來(lái)訪問(wèn)另外一個(gè)應(yīng)用程序域中的對(duì)象,如果在遠(yuǎn)程實(shí)現(xiàn)了加減乘除等運(yùn)算,在本地需要調(diào)用,那么可以考慮在本地設(shè)置一個(gè)代理。.代理模式w 代理模式實(shí)例與解析實(shí)例二:數(shù)學(xué)運(yùn)算代理實(shí)例二:數(shù)學(xué)運(yùn)算代理 realProxyCalculator- real : Rea

9、lCalculator+init ()add (double x, double y)sub (double x, double y)mul (double x, double y)div (double x, double y).: void: double: double: double: doubleRealCalculator+add (double x, double y)sub (double x, double y)mul (double x, double y)div (double x, double y).: double: double: double: doubleCa

10、lculator+add (double x, double y)sub (double x, double y)mul (double x, double y)div (double x, double y).: double: double: double: doublereal.add(x,y);real=new RealCalculator();.代理模式w 模式優(yōu)缺點(diǎn)代理模式的優(yōu)點(diǎn)代理模式的優(yōu)點(diǎn) 代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度。 遠(yuǎn)程代理使得客戶端可以訪問(wèn)在遠(yuǎn)程機(jī)器上的對(duì)象,遠(yuǎn)程機(jī)器可能具有更好的計(jì)算性能與處理速度,可以快速響應(yīng)并處理客戶端請(qǐng)求。 虛

11、擬代理通過(guò)使用一個(gè)小對(duì)象來(lái)代表一個(gè)大對(duì)象,可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度。 保護(hù)代理可以控制對(duì)真實(shí)對(duì)象的使用權(quán)限。.代理模式w 模式優(yōu)缺點(diǎn)代理模式的缺點(diǎn)代理模式的缺點(diǎn) 由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此有些類(lèi)型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢。 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜。.代理模式w 模式適用環(huán)境 根據(jù)代理模式的使用目的,常見(jiàn)的代理模式有以下幾種類(lèi)型:根據(jù)代理模式的使用目的,常見(jiàn)的代理模式有以下幾種類(lèi)型: 遠(yuǎn)程(Remote)代理:為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)本地的代理對(duì)象,這個(gè)不同的地址空間可以是在同一臺(tái)主機(jī)中,

12、也可是在另一臺(tái)主機(jī)中,遠(yuǎn)程代理又叫做大使(Ambassador)。 虛擬(Virtual)代理:如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來(lái)表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。 Copy-on-Write代理:它是虛擬代理的一種,把復(fù)制(克?。┎僮餮舆t到只有在客戶端真正需要時(shí)才執(zhí)行。一般來(lái)說(shuō),對(duì)象的深克隆是一個(gè)開(kāi)銷(xiāo)較大的操作,Copy-on-Write代理可以讓這個(gè)操作延遲,只有對(duì)象被用到的時(shí)候才被克隆。.代理模式w 模式適用環(huán)境 根據(jù)代理模式的使用目的,代理模式有以下幾種類(lèi)型(續(xù)):根據(jù)代理模式的使用目的,代理模式有以下幾種類(lèi)型(續(xù)): 保護(hù)(Protect or

13、Access)代理:控制對(duì)一個(gè)對(duì)象的訪問(wèn),可以給不同的用戶提供不同級(jí)別的使用權(quán)限。 緩沖(Cache)代理:為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶端可以共享這些結(jié)果。 防火墻(Firewall)代理:保護(hù)目標(biāo)不讓惡意用戶接近。 同步化(Synchronization)代理:使幾個(gè)用戶能夠同時(shí)使用一個(gè)對(duì)象而沒(méi)有沖突。 智能引用(Smart Reference)代理:當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,如將此對(duì)象被調(diào)用的次數(shù)記錄下來(lái)等。.代理模式w 模式應(yīng)用 (1) Java RMI (Remote Method Invocation,遠(yuǎn)程方法調(diào)用,遠(yuǎn)程方法調(diào)用)。.代理模式w

14、 模式應(yīng)用(2) EJB、Web Service等分布式技術(shù)都是代理模式等分布式技術(shù)都是代理模式的應(yīng)用。的應(yīng)用。在在EJB中使用了中使用了RMI機(jī)制,遠(yuǎn)程服務(wù)器中的機(jī)制,遠(yuǎn)程服務(wù)器中的企業(yè)級(jí)企業(yè)級(jí)Bean在本地有一個(gè)樁代理,客戶端通過(guò)樁來(lái)調(diào)在本地有一個(gè)樁代理,客戶端通過(guò)樁來(lái)調(diào)用遠(yuǎn)程對(duì)象中定義的方法,而無(wú)須直接與遠(yuǎn)程對(duì)象交用遠(yuǎn)程對(duì)象中定義的方法,而無(wú)須直接與遠(yuǎn)程對(duì)象交互。在互。在EJB的使用中需要提供一個(gè)公共的接口,客戶的使用中需要提供一個(gè)公共的接口,客戶端針對(duì)該接口進(jìn)行編程,無(wú)須知道樁以及遠(yuǎn)程端針對(duì)該接口進(jìn)行編程,無(wú)須知道樁以及遠(yuǎn)程EJB的的實(shí)現(xiàn)細(xì)節(jié)。實(shí)現(xiàn)細(xì)節(jié)。 .代理模式w 模式應(yīng)用(3)

15、Spring 框架中的框架中的AOP技術(shù)技術(shù)也是代理模式的應(yīng)用,也是代理模式的應(yīng)用,在在Spring AOP中應(yīng)用了中應(yīng)用了動(dòng)態(tài)代理動(dòng)態(tài)代理(Dynamic Proxy)技術(shù)技術(shù)。 .代理模式w 模式擴(kuò)展 幾種常用的代理模式幾種常用的代理模式 圖片代理圖片代理:一個(gè)很常見(jiàn)的代理模式的應(yīng)用實(shí)例就是對(duì)大圖瀏覽的控制。 用戶通過(guò)瀏覽器訪問(wèn)網(wǎng)頁(yè)時(shí)先不加載真實(shí)的大圖,而是通過(guò)代理對(duì)象的方法來(lái)進(jìn)行處理,在代理對(duì)象的方法中,先使用一個(gè)線程向客戶端瀏覽器加載一個(gè)小圖片,然后在后臺(tái)使用另一個(gè)線程來(lái)調(diào)用大圖片的加載方法將大圖片加載到客戶端。當(dāng)需要瀏覽大圖片時(shí),再將大圖片在新網(wǎng)頁(yè)中顯示。如果用戶在瀏覽大圖時(shí)加載工作

16、還沒(méi)有完成,可以再啟動(dòng)一個(gè)線程來(lái)顯示相應(yīng)的提示信息。通過(guò)代理技術(shù)結(jié)合多線程編程將真實(shí)圖片的加載放到后臺(tái)來(lái)操作,不影響前臺(tái)圖片的瀏覽。.代理模式w 模式擴(kuò)展幾種常用的代理模式幾種常用的代理模式 遠(yuǎn)程代理遠(yuǎn)程代理:遠(yuǎn)程代理可以將網(wǎng)絡(luò)的細(xì)節(jié)隱藏起來(lái),使得客戶端不必考慮網(wǎng)絡(luò)的存在。客戶完全可以認(rèn)為被代理的遠(yuǎn)程業(yè)務(wù)對(duì)象是局域的而不是遠(yuǎn)程的,而遠(yuǎn)程代理對(duì)象承擔(dān)了大部分的網(wǎng)絡(luò)通信工作。.代理模式w 模式擴(kuò)展幾種常用的代理模式幾種常用的代理模式 虛擬代理虛擬代理:當(dāng)一個(gè)對(duì)象的加載十分耗費(fèi)資源的時(shí)候,虛擬代理的優(yōu)勢(shì)就非常明顯地體現(xiàn)出來(lái)了。虛擬代理模式是一種內(nèi)存節(jié)省技術(shù),那些占用大量?jī)?nèi)存或處理復(fù)雜的對(duì)象將推遲到使

17、用它的時(shí)候才創(chuàng)建。 在應(yīng)用程序啟動(dòng)的時(shí)候,可以用代理對(duì)象代替真實(shí)對(duì)象初始化,節(jié)省了內(nèi)存的占用,并大大加速了系統(tǒng)的啟動(dòng)時(shí)間。.代理模式w 模式擴(kuò)展 動(dòng)態(tài)代理動(dòng)態(tài)代理 動(dòng)態(tài)代理是一種較為高級(jí)的代理模式,它的典型應(yīng)用就是Spring AOP。 在傳統(tǒng)的代理模式中,客戶端通過(guò)Proxy調(diào)用RealSubject類(lèi)的request()方法,同時(shí)還在代理類(lèi)中封裝了其他方法(如preRequest()和postRequest(),可以處理一些其他問(wèn)題。 如果按照這種方法使用代理模式,那么真實(shí)主題角色必須是事先已經(jīng)存在的,并將其作為代理對(duì)象的內(nèi)部成員屬性。如果一個(gè)真實(shí)主題角色必須對(duì)應(yīng)一個(gè)代理主題角色,這將導(dǎo)致

18、系統(tǒng)中的類(lèi)個(gè)數(shù)急劇增加,因此需要想辦法減少系統(tǒng)中類(lèi)的個(gè)數(shù),此外,如何在事先不知道真實(shí)主題角色的情況下使用代理主題角色,這都是動(dòng)態(tài)代理需要解決的問(wèn)題。.代理模式w 模式擴(kuò)展動(dòng)態(tài)代理動(dòng)態(tài)代理 Java動(dòng)態(tài)代理實(shí)現(xiàn)相關(guān)類(lèi)位于java.lang.reflect包,主要涉及兩個(gè)類(lèi): InvocationHandler接口。它是代理實(shí)例的調(diào)用處理程序?qū)崿F(xiàn)的接口,該接口中定義了如下方法:public Object invoke (Object proxy, Method method, Object args) throws Throwable;invoke()方法中第一個(gè)參數(shù)proxy表示代理類(lèi),第二個(gè)參

19、數(shù)method表示需要代理的方法,第三個(gè)參數(shù)args表示代理方法的參數(shù)數(shù)組。.代理模式w 模式擴(kuò)展動(dòng)態(tài)代理動(dòng)態(tài)代理 Proxy類(lèi)。該類(lèi)即為動(dòng)態(tài)代理類(lèi),該類(lèi)最常用的方法為:public static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h) throws IllegalArgumentException。newProxyInstance()方法用于根據(jù)傳入的接口類(lèi)型interfaces返回一個(gè)動(dòng)態(tài)創(chuàng)建的代理類(lèi)的實(shí)例,方法中第一個(gè)參數(shù)loader表示代理類(lèi)的類(lèi)加載器,第二個(gè)參數(shù)interfaces表示代理類(lèi)實(shí)現(xiàn)的接口列表(與真實(shí)主題類(lèi)的接口列表一致),第三個(gè)參數(shù)h表示所指派的調(diào)用處理程序類(lèi)。.代理模式w 模式擴(kuò)展動(dòng)態(tài)代理動(dòng)態(tài)代理 參考代碼 (Chapter 16 ProxyDyna

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論