結(jié)構(gòu)型模式-代理模式_第1頁
結(jié)構(gòu)型模式-代理模式_第2頁
結(jié)構(gòu)型模式-代理模式_第3頁
結(jié)構(gòu)型模式-代理模式_第4頁
結(jié)構(gòu)型模式-代理模式_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、結(jié)構(gòu)型模式-代理模式本章教學(xué)內(nèi)容n代理模式 模式動機與定義 模式結(jié)構(gòu)與分析 模式實例與解析 模式效果與應(yīng)用 模式擴展代理模式n模式動機在某些情況下,一個客戶不想或者不能直接引用一個對象,此時可以通過一個稱之為“代理”的第三者來實現(xiàn)間接引用。代理對象可以在客戶端和目標對象之間起到中介的作用,并且可以通過代理對象去掉客戶不能看到的內(nèi)容和服務(wù)或者添加客戶需要的額外服務(wù)。代理模式n模式動機代理模式n模式動機代理模式n模式動機通過引入一個新的對象(如小圖片和遠程代理對象)來實現(xiàn)對真實對象的操作或者將新的對象作為真實對象的一個替身,這種實現(xiàn)機制即為代理模式,通過引入代理對象來間接訪問一個對象,這就是代理模

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

3、ubjectSubject+ request ().Proxy- realSubject : RealSubject+preRequest ()request ()postRequest ().RealSubject+ request ().Client代理模式n模式結(jié)構(gòu)代理模式包含如下角色:Subject: 抽象主題角色Proxy: 代理主題角色RealSubject: 真實主題角色代理模式n模式分析代理模式示意結(jié)構(gòu)圖比較簡單,一般可以簡化為如下圖所示,但是在現(xiàn)實中要復(fù)雜很多。接口代理類實現(xiàn)類實現(xiàn)實現(xiàn)調(diào)用代理模式n模式分析典型的代理類實現(xiàn)代碼:public class Proxy imple

4、ments Subject private RealSubject realSubject = new RealSubject(); public void preRequest() . public void request() preRequest(); realSubject.request(); postRequest(); public void postRequest() 代理模式n代理模式實例與解析實例一:論壇權(quán)限控制代理 在一個論壇中已注冊用戶和游客的權(quán)限不同,已注冊的用戶擁有發(fā)帖、修改自己的注冊信息、修改自己的帖子等功能;而游客只能看到別人發(fā)的帖子,沒有其他權(quán)限。使用代理模式

5、來設(shè)計該權(quán)限管理模塊。在本實例中我們使用代理模式中的保護代理,該代理用于控制對一個對象的訪問,可以給不同的用戶提供不同級別的使用權(quán)限。代理模式n代理模式實例與解析實例一:論壇權(quán)限控制代理 permissionPermissionProxy-permissionlevel: RealPermission: int = new RealPermission() = 0+modifyUserInfo ()viewNote ()publishNote ()modifyNote ()setLevel (int level): void: void: void: void: voidRealPermiss

6、ion+modifyUserInfo ()viewNote ()publishNote ()modifyNote ()setLevel (int level).: void: void: void: void: voidAbstractPermission+modifyUserInfo ()viewNote ()publishNote ()modifyNote ()setLevel (int level): void: void: void: void: voidClient代理模式n代理模式實例與解析實例二:數(shù)學(xué)運算代理 模擬應(yīng)用遠程代理來訪問另外一個應(yīng)用程序域中的對象,如果在遠程實現(xiàn)了加減

7、乘除等運算,在本地需要調(diào)用,那么可以考慮在本地設(shè)置一個代理。代理模式n代理模式實例與解析實例二:數(shù)學(xué)運算代理 realProxyCalculator- real : RealCalculator+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

8、 y)mul (double x, double y)div (double x, double y).: double: double: double: doubleCalculator+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();代理模式n模式優(yōu)缺點代理模式的優(yōu)點代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一

9、定程度上降低了系統(tǒng)的耦合度。遠程代理使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應(yīng)并處理客戶端請求。虛擬代理通過使用一個小對象來代表一個大對象,可以減少系統(tǒng)資源的消耗,對系統(tǒng)進行優(yōu)化并提高運行速度。保護代理可以控制對真實對象的使用權(quán)限。代理模式n模式優(yōu)缺點代理模式的缺點由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。實現(xiàn)代理模式需要額外的工作,有些代理模式的實現(xiàn)非常復(fù)雜。代理模式n模式適用環(huán)境根據(jù)代理模式的使用目的,常見的代理模式有以下幾種類型:遠程(Remote)代理:為一個位于不同的地址空間的對象提

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

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

12、Web Service等分布式技術(shù)都是代理模式的應(yīng)用。在EJB中使用了RMI機制,遠程服務(wù)器中的企業(yè)級Bean在本地有一個樁代理,客戶端通過樁來調(diào)用遠程對象中定義的方法,而無須直接與遠程對象交互。在EJB的使用中需要提供一個公共的接口,客戶端針對該接口進行編程,無須知道樁以及遠程EJB的實現(xiàn)細節(jié)。 代理模式n模式應(yīng)用(3) Spring 框架中的AOP技術(shù)也是代理模式的應(yīng)用,在Spring AOP中應(yīng)用了動態(tài)代理(Dynamic Proxy)技術(shù)。 代理模式n模式擴展幾種常用的代理模式 圖片代理圖片代理:一個很常見的代理模式的應(yīng)用實例就是對大圖瀏覽的控制。 n用戶通過瀏覽器訪問網(wǎng)頁時先不加載真

13、實的大圖,而是通過代理對象的方法來進行處理,在代理對象的方法中,先使用一個線程向客戶端瀏覽器加載一個小圖片,然后在后臺使用另一個線程來調(diào)用大圖片的加載方法將大圖片加載到客戶端。當(dāng)需要瀏覽大圖片時,再將大圖片在新網(wǎng)頁中顯示。如果用戶在瀏覽大圖時加載工作還沒有完成,可以再啟動一個線程來顯示相應(yīng)的提示信息。通過代理技術(shù)結(jié)合多線程編程將真實圖片的加載放到后臺來操作,不影響前臺圖片的瀏覽。代理模式n模式擴展幾種常用的代理模式 遠程代理遠程代理:遠程代理可以將網(wǎng)絡(luò)的細節(jié)隱藏起來,使得客戶端不必考慮網(wǎng)絡(luò)的存在??蛻敉耆梢哉J為被代理的遠程業(yè)務(wù)對象是局域的而不是遠程的,而遠程代理對象承擔(dān)了大部分的網(wǎng)絡(luò)通信工作

14、。代理模式n模式擴展幾種常用的代理模式 虛擬代理虛擬代理:當(dāng)一個對象的加載十分耗費資源的時候,虛擬代理的優(yōu)勢就非常明顯地體現(xiàn)出來了。虛擬代理模式是一種內(nèi)存節(jié)省技術(shù),那些占用大量內(nèi)存或處理復(fù)雜的對象將推遲到使用它的時候才創(chuàng)建。n在應(yīng)用程序啟動的時候,可以用代理對象代替真實對象初始化,節(jié)省了內(nèi)存的占用,并大大加速了系統(tǒng)的啟動時間。Public class Proxy implements Subject private Subject subject; public void request() if(subject = null) subject = new RealSubject(); 成都信

15、息工程學(xué)院軟件工程系272022-5-22虛擬代理代碼代理模式n模式擴展動態(tài)代理 動態(tài)代理是一種較為高級的代理模式,它的典型應(yīng)用就是Spring AOP。在傳統(tǒng)的代理模式中,客戶端通過Proxy調(diào)用RealSubject類的request()方法,同時還在代理類中封裝了其他方法(如preRequest()和postRequest(),可以處理一些其他問題。如果按照這種方法使用代理模式,那么真實主題角色必須是事先已經(jīng)存在的,并將其作為代理對象的內(nèi)部成員屬性。如果一個真實主題角色必須對應(yīng)一個代理主題角色,這將導(dǎo)致系統(tǒng)中的類個數(shù)急劇增加,因此需要想辦法減少系統(tǒng)中類的個數(shù),此外,如何在事先不知道真實主

16、題角色的情況下使用代理主題角色,這都是動態(tài)代理需要解決的問題。代理模式n模式擴展動態(tài)代理 Java動態(tài)代理實現(xiàn)相關(guān)類位于java.lang.reflect包,主要涉及兩個類:InvocationHandler接口。它是代理實例的調(diào)用處理程序?qū)崿F(xiàn)的接口,該接口中定義了如下方法:public Object invoke (Object proxy, Method method, Object args) throws Throwable;invoke()方法中第一個參數(shù)proxy表示代理類,第二個參數(shù)method表示需要代理的方法,第三個參數(shù)args表示代理方法的參數(shù)數(shù)組。代理模式n模式擴展動態(tài)代

17、理 Proxy類。該類即為動態(tài)代理類,該類最常用的方法為:public static Object newProxyInstance(ClassLoader loader, Class interfaces, InvocationHandler h) throws IllegalArgumentException。newProxyInstance()方法用于根據(jù)傳入的接口類型interfaces返回一個動態(tài)創(chuàng)建的代理類的實例,方法中第一個參數(shù)loader表示代理類的類加載器,第二個參數(shù)interfaces表示代理類實現(xiàn)的接口列表(與真實主題類的接口列表一致),第三個參數(shù)h表示所指派的調(diào)用處理程

18、序類。本章小結(jié)n在代理模式中,要求給某一個對象提供一個代理,并由代理對象控制對原對象的引用。代理模式的英文叫做Proxy或Surrogate,它是一種對象結(jié)構(gòu)型模式。n代理模式包含三個角色:抽象主題角色聲明了真實主題和代理主題的共同接口;代理主題角色內(nèi)部包含對真實主題的引用,從而可以在任何時候操作真實主題對象;真實主題角色定義了代理角色所代表的真實對象,在真實主題角色中實現(xiàn)了真實的業(yè)務(wù)操作,客戶端可以通過代理主題角色間接調(diào)用真實主題角色中定義的方法。n代理模式的優(yōu)點在于能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度;其缺點在于由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論