• <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)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 328615
            • 排名 - 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 閱讀(508) 評論(0)  編輯 收藏 引用 所屬分類: Design Pattern
            久久国产免费观看精品3| 久久久久久免费视频| 色诱久久av| 精品无码久久久久久久久久| 青青青青久久精品国产 | 人人狠狠综合久久亚洲婷婷| 久久久青草久久久青草| 久久精品国产色蜜蜜麻豆| 久久久高清免费视频| 久久人人爽人人爽人人片av高请 | 精品久久综合1区2区3区激情 | a高清免费毛片久久| 久久久久国产精品嫩草影院| 一本大道久久香蕉成人网| 久久九九青青国产精品| 美女久久久久久| 2021国产成人精品久久| 91精品国产综合久久精品| 精品无码久久久久久久动漫| 久久久久人妻一区精品性色av| 久久人搡人人玩人妻精品首页| 国产成人精品久久免费动漫| 久久久久久精品无码人妻| 精品久久久久久99人妻| 久久精品亚洲精品国产色婷 | 久久久久久国产精品无码下载| 精品久久一区二区| 久久精品无码午夜福利理论片 | 国产69精品久久久久99| 久久久久AV综合网成人| 伊人久久大香线蕉综合5g| 久久精品国产亚洲一区二区三区| 久久91精品国产91久久麻豆| 欧美va久久久噜噜噜久久| 偷偷做久久久久网站| 国内精品伊人久久久久妇| 91精品免费久久久久久久久| 久久99精品久久只有精品| 好久久免费视频高清| 久久精品无码一区二区无码| 精品蜜臀久久久久99网站|