漫说代理模式---给宝宝成长护航
1. 寶寶還很小,外面的世界可不安全,現在寶寶的護航者寶寶的監護人爸爸媽媽閃亮登場。
?
2,監護過程:有了監護人,寶寶就比較安全了,如果誰想和寶寶一起玩就需要先找到監護人,經過監護人同意才可以和寶寶一起玩。
還比如過年了,寶寶收到很多壓歲錢,需要把錢存到銀行,就需要父母幫忙才可以。
3. 上面就用到了代理模式。
As described by GoF:
"Provide a surrogate or placeholder for another object to control access over it."
UML圖如下所示:
1)代理角色(Proxy):
. 保存一個引用使得代理可以訪問實體。若 RealSubject和Subject的接口相同,Proxy會引用Subject。
. 提供一個與Subject的接口相同的接口,這樣代理就可以用來替代實體。
. 控制對實體的存取,并可能負責創建和刪除它。
. 其他功能依賴于代理的類型:
? Remote Proxy負責對請求及其參數進行編碼,并向不同地址空間中的實體發送已編碼的請求。
? Virtual Proxy可以緩存實體的附加信息,以便延遲對它的訪問。
? Protection Proxy檢查調用者是否具有實現一個請求所必需的訪問權限。
2) 抽象主題角色(Subject):定義真實主題角色RealSubject 和 抽象主題角色Proxy的共用接口,這樣就在任何使用RealSubject的地方都可以使
用Proxy。代理主題通過持有真實主題RealSubject的引用,不但可以控制真實主題RealSubject的創建或刪除,可以在真實主題RealSubject被調用前進行攔截,或在調用后進行某些操作.?
3) 真實主題角色(RealSubject):定義了代理角色(proxy)所代表的具體對象.?
?
4. 代理模式的應用場景
-
1) Remote Proxy可以隱藏一個對象存在于不同地址空間的事實。也使得客戶端可以訪問在遠程機器上的對象,遠程機器可能具有更好的計算性能與處理速度,可以快速響應并處理客戶端請求。
2) Virtual Proxy?可以進行最優化,例如根據要求創建對象。即通過使用一個小對象來代表一個大對象,可以減少系統資源的消耗。
3) Protection Proxies和Smart Reference都允許在訪問一個對象時有一些附加的內務處理(Housekeeping task) 。Proxy模式還可以對用戶隱藏另一種稱之為寫時復制(copy-on-write)的優化方式,該優化與根據需要創建對象有關。拷貝一個龐大而復雜的對象是一種開銷很大的操作,如果這個拷貝根本沒有被修改,那么這些開銷就沒有必要。用代理延遲這一拷貝過程,我們可以保證只有當這個對象被修改的時候才對它進行拷貝。在實現copy-on-write時必須對實體進行引用計數。拷貝代理僅會增加引用計數。只有當用戶請求一個修改該實體的操作時,代理才會真正的拷貝它。在這種情況下,代理還必須減
代理模式能夠協調調用者和被調用者,在一定程度上降低了系統的耦合度。
少實體的引用計數。當引用的數目為零時,這個實體將被刪除。copy-on-write可以大幅度的降低拷貝龐大實體時的開銷。 - 代理模式的缺點
由于在客戶端和真實主題之間增加了代理對象,因此有些類型的代理模式可能會造成請求的處理速度變慢。
實現代理模式需要額外的工作,有些代理模式的實現非常復雜。
5. 示例程序:
? ??JDK proxies
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface AnInterface {public void doSomething(); } class AClass implements AnInterface {public void doSomething() {System.out.println("Inside Method AClass.doSomething()");} } public class Test {public static void main(String args[]) {AnInterface realSubject = new AClass();AnInterface proxy = (AnInterface)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),new SimpleInvocationHandler(realSubject));passMeAProxy(proxy);}private static void passMeAProxy(AnInterface anInterface) {anInterface.doSomething();} } class SimpleInvocationHandler implements InvocationHandler {public SimpleInvocationHandler(Object realSubject) {this.realSubject = realSubject;}public Object invoke(Object proxy, Method m, Object[] args){Object result = null;System.out.println("Before Calling " + m.getName());try {result = m.invoke(realSubject, args); }catch(Exception ex) {System.exit(1);}System.out.println("After Calling " + m.getName());return result;}private Object realSubject = null; }?
?reference from :
? ?http://www.oodesign.com/proxy-pattern.html
? ?http://www.javaworld.com/article/2074068/learn-java/take-control-with-the-proxy-design-pattern.html?page=2
? ?http://blog.csdn.net/hguisu/article/details/7542143
?
轉載于:https://www.cnblogs.com/davidwang456/p/3665905.html
總結
以上是生活随笔為你收集整理的漫说代理模式---给宝宝成长护航的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Understanding transi
- 下一篇: linux vi 撤销重做于前进后退--