設(shè)計模式中定義: 為其他對象提供一種代理以控制對這個對象的訪問.
在我們實際生活中代理情況無處不在踪栋!你在淘寶上面買東西报亩,你使用支付寶平臺支付宋梧,賣家請物流公司發(fā)貨虐译、你請朋友幫你拿包裹,在這個過程匯總支付寶鹅龄、物流公司揩慕、你朋友都扮演者“第三者”的角色在幫你完成物品的購買,這里的第三者我們可以將其稱之為代理者。
所謂代理就通過引用一個新的對象來實現(xiàn)對真實對象的操作或者將新的對象當做真實對象的一個替身扮休,這種實現(xiàn)的機制就是代理模式迎卤,通過引用代理對象來訪問真實對象就是代理模式的設(shè)計動機。
模式結(jié)構(gòu)
在代理模式中有如下三個角色:
Subject: 抽象角色玷坠。聲明真實對象和代理對象的共同接口蜗搔。
Proxy: 代理角色。代理對象與真實對象實現(xiàn)相同的接口八堡,所以它能夠在任何時刻都能夠代理真實對象樟凄。代理角色內(nèi)部包含有對真實對象的引用,所以她可以操作真實對象兄渺,同時也可以附加其他的操作缝龄,相當于對真實對象進行封裝。
RealSubject: 真實角色挂谍。它代表著真實對象叔壤,是我們最終要引用的對象
優(yōu)點:
1、 代理模式能夠協(xié)調(diào)調(diào)用者和被調(diào)用者口叙,在一定程度上降低了系統(tǒng)的耦合度炼绘。
2、 代理對象可以在客戶端和目標對象之間起到中介的作用妄田,這樣起到了的作用和保護了目標對象的
缺點:
1俺亮、由于在客戶端和真實主題之間增加了代理對象仗哨,因此有些類型的代理模式可能會造成請求的處理速度變慢。
2铅辞、 實現(xiàn)代理模式需要額外的工作厌漂,有些代理模式的實現(xiàn)非常復雜。
適用場景:
1斟珊、 遠程代理:為一個對象在不同的地址空間提供局部代表苇倡。這樣可以隱藏一個對象存在于不同地址空間的事實。
2囤踩、 虛擬代理:通過使用過一個小的對象代理一個大對象旨椒。這樣就可以減少系統(tǒng)的開銷。
3堵漱、 保護代理:用來控制對真實對象的訪問權(quán)限综慎。
為什么要使用Proxy?
1.授權(quán)機制?不同級別的用戶對同一對象擁有不同的訪問權(quán)利,如Jive論壇系統(tǒng)中,就使用Proxy進行授權(quán)機制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權(quán)限.
2.某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動.
舉例兩個具體情況:
(1)如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那么當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片.
(2)如果那個對象在Internet的某個遠端服務(wù)器上,直接操作這個對象因為網(wǎng)絡(luò)速度原因可能比較慢,那我們可以先用Proxy來代替那個對象.
總之原則是,對于開銷很大的對象,只有在使用它時才創(chuàng)建,這個原則可以為我們節(jié)省很多寶貴的Java內(nèi)存.?所以,有些人認為Java耗費資源內(nèi)存,我以為這和程序編制思路也有一定的關(guān)系.