• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            為生存而奔跑

               :: 首頁 :: 聯系 :: 聚合  :: 管理
              271 Posts :: 0 Stories :: 58 Comments :: 0 Trackbacks

            留言簿(5)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 326993
            • 排名 - 74

            最新評論

            閱讀排行榜

            評論排行榜

            代理模式,個人認為就是把你要使用的一個對象盡享封裝,包裝。編程原對象的一個副本,在使用的時候直接使用他這個副本就可以了!他的作用用專業點的語言描 述就是為其他的對象提供一個代理方便控制這個對象。當我們不能直接調用另外一個對象,但是又不得不用這個對象的某些功能,此時代理對象就能起到鏈接客戶和 目標對象的一個代理.
            代理模式一般涉及到三個角色,分別為:
            1. 抽象角色:他提供真實對象和代理對象的共同接口。
            2. 代理角色:通俗地說,代理角色是對原對象(目標對象)進行包裝,他有著和原對象相同的接口,并且可以執行真實對象的操作。
            3. 真實角色:即目標對象,最終我們需要對他的操作。
            代理模式分為兩種,一 靜態代理,二 動態代理。

            接下來我們介紹一下兩種代理模式:

            一 靜態代理
               靜態代理即 代理對象和被代理對象在代理之前已經確定好了。他們一起實現相同的接口或者是繼承相同的抽象類。例如:
            Java代碼
            1. //定義抽象角色  
            2. public abstract class AbsRole{  
            3.   abstract public void work();  
            4. }  


            Java代碼
            1. //定義真實角色  
            2. public class RealRole extends AbsRole{  
            3.   public RealRole(){ }  
            4.   
            5.   public void work(){  
            6.     System.out.println("調用真實角色中函數!");  
            7.   }  
            8. }  

            Java代碼
            1. //代理角色  
            2. public class ProxyRole extends AbsRole{  
            3.   public RealRole real ;  
            4.     
            5.   public ProxyRole(){  
            6.   }  
            7.   
            8.   public void work(){  
            9.     this.beforeMethod();  
            10.     if(real == null){  
            11.       real = new RealRole();  
            12.     }  
            13.     real.work();  
            14.     this.endMethod();  
            15.   }  
            16.   
            17.   public void beforeMethod(){  
            18.     System.out.println("代理前執行函數->beforeMethod()");  
            19.   }  
            20.     
            21.   public void endMethod(){  
            22.     System.out.println("代理時候后執行函數->endMethod()");  
            23.   }  
            24. }  


            各種角色我們都已經定義好了,我們開始測試一下。

            Java代碼
            1. public class Main(){  
            2.   public static void main(String[] args){  
            3.     AbsRole ar = new ProxyRole();  
            4.     ar.work();  
            5.   }  
            6. }  


            二 動態代理
              顧名思義,就是不知道到底那個類需要做代理,在使用的時候,更具情況臨時決定。
               java動態代理主要是使用java.lang.reflect包中的兩個類。
            1. interface InvocationHandler: 他中定義了一個方法
            Java代碼
            1. public Object invoke(Object obj,Method method,Object[] obs)  

              其中第一個參數 obj 指的是代理類,method是被代理的方法,obs是指被代理的方法的參數組。此方法由代理類來實現。
            2. Proxy:該類為動態代理類,主要包括以下內容:

            Java代碼
            1. protected Proxy(InvocationHandler h);  
            2.   
            3. static Class getProxyClass(ClassLoader loader,Class[] interfaces);  
            4.   
            5. static Object newProxyInstance(ClassLoader loader,Class[]interfaces,InvocationHandler h);  


            動態代理其實是在運行時生成class,所以,我們必須提供一組interface,然后告訴他class已經實現了這些interface,而且在生成Proxy的時候,必須給他提供一個handler,讓他來接管實際的工作。
            現在我們把靜態代理的例子修改一下:
            Java代碼
            1. //定義抽象角色;  
            2. public interface AbsRole{  
            3.   public void work();  
            4. }  


            接下來定義真實角色;
            Java代碼
            1. public class RealRole implements AbsRole{  
            2.   public RealRole(){};  
            3.     
            4.   public void work(){  
            5.     System.out.println("調用真實角色方法:RealRole.work()");  
            6.   }  
            7. }  

            然后書寫動態代理編碼
            Java代碼
            1. public class DynamicProxyRole implements InvocationHandler{  
            2.   private Object sub;  
            3.     
            4.   public DynamicProxyRole(){}  
            5.   
            6.   public DynamicProxyRole(Object ob){  
            7.     this.sub = ob;  
            8.   }  
            9.   
            10.   public Object invoke(Object proxy, Method method, Object[] obs) throws Throwable{  
            11.     method.invke(sub,obs);  
            12.     return null;  
            13.   }  
            14. }  

            代理類已經書寫完畢,看看是否能正常運行。
            Java代碼
            1. public class Main{  
            2.   public static void main(String[] args){  
            3.     RealRole  rr  = new RealRole();  
            4.     InvocationHandler dynamicProxy = new DynamicProxyRole(rr);  
            5.     Class<?> cls = rr.getClass();  
            6.       
            7.     AbsRole r = (AbsRole)Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),DynamicProxyRole);  
            8.     r.work();  
            9.   }  
            10. }  


            調試成功,動態代理功能完成。

            通過靜態代理和動態代理學習,我們小結一下:
            靜態代理需要事先確定代理對象和被代理對象,他們要一起繼承或者是實現相同的抽象類。動態代理可以在使用的時候傳入真實對象,得到代理。動態代理還是主要依靠java本身的語言特性,實現代理,更加方便
            posted on 2009-11-28 13:13 baby-fly 閱讀(502) 評論(0)  編輯 收藏 引用 所屬分類: Design Pattern
            久久久久久人妻无码| 一级做a爰片久久毛片免费陪| 伊人久久精品无码av一区| 少妇久久久久久被弄高潮| 1000部精品久久久久久久久| 国产成人久久精品二区三区| 久久一本综合| 狠狠色丁香婷婷久久综合不卡| 久久se精品一区精品二区国产 | 国内精品九九久久精品| 99久久人妻无码精品系列| 久久精品国产黑森林| 久久A级毛片免费观看| 久久青青草原精品国产软件| 精品综合久久久久久888蜜芽| 久久九色综合九色99伊人| 97久久精品国产精品青草| 欧美亚洲国产精品久久久久| 久久精品国产免费一区| 久久人妻AV中文字幕| 久久性精品| 国产高清美女一级a毛片久久w| 嫩草伊人久久精品少妇AV| 久久久高清免费视频| 日本久久久久久久久久| 国产成人综合久久久久久| 久久精品国产免费一区| 久久精品国产第一区二区三区| 波多野结衣久久一区二区| 久久se精品一区二区影院 | 欧美伊人久久大香线蕉综合| 久久99国产精品久久99果冻传媒| 偷偷做久久久久网站| 久久丫忘忧草产品| 国产精品久久新婚兰兰| 久久青青草视频| 人妻无码精品久久亚瑟影视| 日本精品一区二区久久久| 一本色道久久88综合日韩精品| 久久亚洲中文字幕精品一区四| 久久久久人妻精品一区三寸蜜桃|