posts - 73,  comments - 55,  trackbacks - 0

          設計模式中定義: 為其他對象提供一種代理以控制對這個對象的訪問.

          為什么要使用Proxy?
          1.授權機制

          我們開發一個應用系統時,用戶請求任何頁面都要經過權限控制,最早開發的時候我們常常封裝一個權限驗證方法,然后在每個jsp或者對應的servlet中增加相關代碼,但是用戶對權限的需求往往是多變的,這樣一旦權限驗證方法變化(參數變化,增加方法),如果開發的系統很龐大的話,有可能你就需要修改幾百個jsp頁面或者servlet代碼。
          還有我們常需要判斷session是否過期,如果過期就要重新登陸系統,如果每個頁面或者servlet都要加判斷代碼,那也是件比較痛苦的事情。
          如果我們采用代理模式,增加Proxy對象,每次用戶請求必須通過proxy對象處理,由它專門處理相關權限控制,一旦權限需求變化了,只需要修改Proxy對象相關的實現方法。

          2.某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動.
          舉例4個具體情況:
          u 一個對象,比如一幅很大的圖像,需要載入的時間很長。

          u 一個需要很長時間才可以完成的計算結果,并且需要在它計算過程中顯示中間結果

          u 一個存在于遠程計算機上的對象,需要通過網絡載入這個遠程對象則需要很長時間,特別是在網絡傳輸高峰期。

          u 一個對象只有有限的訪問權限,代理模式(Proxy)可以驗證用戶的權限


          總之原則是,對于開銷很大的對象,只有在使用它時才創建,這個原則可以為我們節省很多寶貴的Java內存. 所以,有些人認為Java耗費資源內存,我以為這和程序編制思路也有一定的關系.


          簡單實例:
          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()");
          ?}
          }

          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;
          }

          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();
          ?}
          }

          posted on 2006-07-25 14:28 保爾任 閱讀(593) 評論(1)  編輯  收藏 所屬分類: Design Patten

          FeedBack:
          # re: Proxy(代理)模式
          2007-11-08 20:57 | 李欽欽
          今天謝謝你的幫助.祝你好運  回復  更多評論
            

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宜川县| 双流县| 离岛区| 灵川县| 新源县| 姜堰市| 岳阳市| 渝北区| 昌平区| 凌源市| 循化| 龙陵县| 佳木斯市| 乳山市| 朝阳县| 阿拉尔市| 河间市| 武乡县| 且末县| 玛纳斯县| 敦煌市| 拜城县| 苍梧县| 鲁甸县| 济南市| 清河县| 溆浦县| 阿合奇县| 南阳市| 伽师县| 定南县| 广汉市| 杂多县| 邯郸县| 罗山县| 济宁市| 万宁市| 东安县| 绥阳县| 和政县| 望城县|