【文章內(nèi)容簡介】
現(xiàn) 實(shí)現(xiàn)調(diào)用05:21 47 代理模式 ?模式分析 ? 典型的代理類實(shí)現(xiàn)代碼: public class Proxy implements Subject { private RealSubject realSubject = new RealSubject()。 public void preRequest() {…...} public void request() { preRequest()。 ()。 postRequest()。 } public void postRequest() {……} } 05:21 48 代理模式 ?代理模式實(shí)例與解析 ?實(shí)例一:論壇權(quán)限控制代理 ? 在一個(gè)論壇中已注冊(cè)用戶和游客的權(quán)限不同,已注冊(cè)的用戶擁有發(fā)帖、修改自己的注冊(cè)信息、修改自己的帖子等功能;而游客只能看到別人發(fā)的帖子,沒有其他權(quán)限。使用代理模式來設(shè)計(jì)該權(quán)限管理模塊。 ? 在本實(shí)例中我們使用代理模式中的保護(hù)代理,該代理用于控制對(duì)一個(gè)對(duì)象的訪問,可以給不同的用戶提供不同級(jí)別的使用權(quán)限。 05:21 49 代理模式 ?代理模式實(shí)例與解析 ?實(shí)例一:論壇權(quán)限控制代理 p e r m i ssi o nPe rm issio nP rox ype rm issio nleve l: Re alP erm issio n: int = ne w R ea lPe rm issio n() = 0+++++m od ifyU serI nfo ()viewNote ()pu blish Not e ()m od ifyN ote ()setLevel (int level): void: void: void: void: voidRea lPe rm issio n+++++m od ifyU serI nfo ()viewNote ()pu blish Not e ()m od ifyN ote ()setLevel (int level)...: void: void: void: void: voidA bst ract Pe rm issio n+++++m od ifyU serI nfo ()viewNote ()pu blish Not e ()m od ifyN ote ()setLevel (int level): void: void: void: void: voidClie nt05:21 50 代理模式 ?代理模式實(shí)例與解析 ?實(shí)例一:論壇權(quán)限控制代理 ? 參考代碼 演示 …… 05:21 51 代理模式 ?代理模式實(shí)例與解析 ?實(shí)例二:數(shù)學(xué)運(yùn)算代理 ? 模擬應(yīng)用遠(yuǎn)程代理來訪問另外一個(gè)應(yīng)用程序域中的對(duì)象,如果在遠(yuǎn)程實(shí)現(xiàn)了加減乘除等運(yùn)算,在本地需要調(diào)用,那么可以考慮在本地設(shè)置一個(gè)代理。 05:21 52 代理模式 ?代理模式實(shí)例與解析 ?實(shí)例二:數(shù)學(xué)運(yùn)算代理 r e a lPro x yCa lcula tor rea l : RealCalcula tor+++++init ()ad d (d ou ble x , d ou ble y)sub (double x , double y)m ul (d ou ble x , d ou ble y)div (do ub le x , d ou ble y)...: void: doub le: doub le: doub le: doub leRea lCal cula tor++++ad d (d ou ble x , d ou ble y)sub (double x , double y)m ul (d ou ble x , d ou ble y)div (do ub le x , d ou ble y)...: doub le: doub le: doub le: doub leCalc ula tor++++ad d (d ou ble x , d ou ble y)sub (double x , double y)m ul (d ou ble x , d ou ble y)div (do ub le x , d ou ble y)...: doub le: doub le: doub le: doub ler e a l . a d d ( x , y ) 。r e a l = n e w R e a l C a l cu l a t o r ( ) 。05:21 53 代理模式 ?模式優(yōu)缺點(diǎn) ?代理模式的優(yōu)點(diǎn) ? 代理模式能夠 協(xié)調(diào)調(diào)用者和被調(diào)用者 ,在一定程度上降低了系統(tǒng)的耦合度。 ? 遠(yuǎn)程代理使得客戶端可以訪問在遠(yuǎn)程機(jī)器上的對(duì)象 ,遠(yuǎn)程機(jī)器可能具有更好的計(jì)算性能與處理速度,可以快速響應(yīng)并處理客戶端請(qǐng)求。 ? 虛擬代理 通過使用一個(gè)小對(duì)象來代表一個(gè)大對(duì)象, 可以減少系統(tǒng)資源的消耗,對(duì)系統(tǒng)進(jìn)行優(yōu)化并提高運(yùn)行速度 。 ? 保護(hù)代理可以控制對(duì)真實(shí)對(duì)象的使用權(quán)限 。 05:21 54 代理模式 ?模式優(yōu)缺點(diǎn) ?代理模式的缺點(diǎn) ? 由于在客戶端和真實(shí)主題之間增加了代理對(duì)象,因此有些類型的代理模式可能會(huì)造成請(qǐng)求的處理速度變慢 。 ? 實(shí)現(xiàn)代理模式需要額外的工作,有些代理模式的實(shí)現(xiàn)非常復(fù)雜 。 05:21 55 代理模式 ?模式適用環(huán)境 ? 根據(jù)代理模式的使用目的,常見的代理模式有以下幾種類型: ? 遠(yuǎn)程 (Remote)代理 :為一個(gè)位于不同的地址空間的對(duì)象提供一個(gè)本地的代理對(duì)象,這個(gè)不同的地址空間可以是在同一臺(tái)主機(jī)中,也可是在另一臺(tái)主機(jī)中,遠(yuǎn)程代理又叫做大使 (Ambassador)。 ? 虛擬 (Virtual)代理 :如果需要?jiǎng)?chuàng)建一個(gè)資源消耗較大的對(duì)象,先創(chuàng)建一個(gè)消耗相對(duì)較小的對(duì)象來表示,真實(shí)對(duì)象只在需要時(shí)才會(huì)被真正創(chuàng)建。 ? CopyonWrite代理 :它是虛擬代理的一種,把復(fù)制(克?。┎僮餮舆t到只有在客戶端真正需要時(shí)才執(zhí)行。一般來說,對(duì)象的深克隆是一個(gè)開銷較大的操作, CopyonWrite代理可以讓這個(gè)操作延遲,只有對(duì)象被用到的時(shí)候才被克隆。 05:21 56 代理模式 ?模式適用環(huán)境 ? 根據(jù)代理模式的使用目的,代理模式有以下幾種類型(續(xù)): ? 保護(hù) (Protect or Access)代理 :控制對(duì)一個(gè)對(duì)象的訪問,可以給不同的用戶提供不同級(jí)別的使用權(quán)限。 ? 緩沖 (Cache)代理 :為某一個(gè)目標(biāo)操作的結(jié)果提供臨時(shí)的存儲(chǔ)空間,以便多個(gè)客戶端可以共享這些結(jié)果。 ? 防火墻 (Firewall)代理 :保護(hù)目標(biāo)不讓惡意用戶接近。 ? 同步化 (Synchronization)代理 :使幾個(gè)用戶能夠同時(shí)使用一個(gè)對(duì)象而沒有沖突。 ? 智能引用 (Smart Reference)代理 :當(dāng)一個(gè)對(duì)象被引用時(shí),提供一些額外的操作,如將此對(duì)象被調(diào)用的次數(shù)記錄下來等。 05:21 57 代理模式 ? 模式應(yīng)用 ? (1) Java RMI (Remote Method Invocation,遠(yuǎn)程方法調(diào)用 )。 05:21 58 代理模式 ?模式應(yīng)用 ?(2) EJB、 Web Service等分布式技術(shù)都是代理模式的應(yīng)用。 在 EJB中使用了 RMI機(jī)制,遠(yuǎn)程服務(wù)器中的企業(yè)級(jí) Bean在本地有一個(gè)樁代理,客戶端通過樁來調(diào)用遠(yuǎn)程對(duì)象中定義的方法,而無須直接與遠(yuǎn)程對(duì)象交互。在 EJB的使用中需要提供一個(gè)公共的接口,客戶端針對(duì)該接口進(jìn)行編程,無須知道樁以及遠(yuǎn)程 EJB的實(shí)現(xiàn)細(xì)節(jié)。 05:21 59 代理模式 ?模式應(yīng)用 ?(3) Spring 框架中的 AOP技術(shù) 也是代理模式的應(yīng)用,在 Spring AOP中應(yīng)用了 動(dòng)態(tài)代理 (Dynamic Proxy)技術(shù) 。 05:21 60 代理模式 ? 模式擴(kuò)展 ? 幾種常用的代理模式 ? 圖片代理 :一個(gè)很常見的代理模式的應(yīng)用實(shí)例就是 對(duì)大圖瀏覽的控制 。 ? 用戶通過瀏覽器訪問網(wǎng)頁時(shí)先不加載真實(shí)的大圖,而是通過代理對(duì)象的方法來進(jìn)行處理,在代理對(duì)象的方法中, 先使用一個(gè)線程向客戶端瀏覽器加載一個(gè)小圖片 ,然后在后臺(tái)使用另一個(gè)線程來調(diào)用大圖片的加載方法將大圖片加載到客戶端。當(dāng)需要瀏覽大圖片時(shí),再將大圖片在新網(wǎng)頁中顯示。如果用戶在瀏覽大圖時(shí)加載工作還沒有完成,可以再啟動(dòng)一個(gè)線程來顯示相應(yīng)的提示信息。 通過代理技術(shù)結(jié)合多線程編程將真實(shí)圖片的加載放到后臺(tái)來操作,不影響前臺(tái)圖片的瀏覽。 05:21 61 代理模式 ?模式擴(kuò)展 ?幾種常用的代理模式 ? 遠(yuǎn)程代理 : 遠(yuǎn)程代理可以將網(wǎng)絡(luò)的細(xì)節(jié)隱藏起來,使得客戶端不必考慮網(wǎng)絡(luò)的存在??蛻敉耆梢哉J(rèn)為被代理的遠(yuǎn)程業(yè)務(wù)對(duì)象是局域的而不是遠(yuǎn)程的,而遠(yuǎn)程代理對(duì)象承擔(dān)了大部分的網(wǎng)絡(luò)通信工作。 05:21 62 代理模式 ?模式擴(kuò)展 ?幾種常用的代理模式 ? 虛擬代理 : 當(dāng)一個(gè)對(duì)象的加載十分耗費(fèi)資源的時(shí)候,虛擬代理的優(yōu)勢就非常明顯地體現(xiàn)出來了。 虛擬代理模式是一種內(nèi)存節(jié)省技術(shù) ,那些占用大量內(nèi)存或處理復(fù)雜的對(duì)象將推遲到使用它的時(shí)候才創(chuàng)建。 ? 在應(yīng)用程序啟動(dòng)的時(shí)候,可以用代理對(duì)象代替真實(shí)對(duì)象初始化,節(jié)省了內(nèi)存的占用,并大大加速了系統(tǒng)的啟動(dòng)時(shí)間。 05:21 63 代理模式 ? 模式擴(kuò)展 ? 動(dòng)態(tài)代理 ? 動(dòng)態(tài)代理是一種較為高級(jí)的代理模式,它的典型應(yīng)用就是 Spring AOP。 ? 在傳統(tǒng)的代理模式中,客戶端通過 Proxy調(diào)用 RealSubject類的 request()方法,同時(shí)還在代理類中封裝了其他方法 (如 preRequest()和postRequest()),可以處理一些其他問題。 ? 如果按照這種方法使用代理模式, 那么真實(shí)主題角