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

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 327087
            • 排名 - 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
            久久久久久亚洲精品影院| 久久精品国产亚洲av高清漫画| 国产精品一久久香蕉产线看 | 国产精品毛片久久久久久久| 久久线看观看精品香蕉国产| 中文成人无码精品久久久不卡| 狠狠色婷婷久久一区二区| 国内精品久久人妻互换| 久久久久香蕉视频| 99久久99这里只有免费费精品| 国产精品久久久久久搜索| 中文字幕亚洲综合久久菠萝蜜| 国产精品久久久久天天影视| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久精品国产亚洲av麻豆图片| 无码伊人66久久大杳蕉网站谷歌| 99久久精品费精品国产| 波多野结衣中文字幕久久| 无码乱码观看精品久久| 99久久精品费精品国产| 久久久国产精品| 日韩美女18网站久久精品| 国産精品久久久久久久| 久久精品成人免费观看97| 99久久免费只有精品国产| 久久99国产精品久久久| 国产91色综合久久免费| 精品久久久久久久| 久久久久综合中文字幕| 亚洲综合久久夜AV | 久久大香萑太香蕉av| 久久精品综合网| 久久精品国产亚洲αv忘忧草| 亚洲AV日韩AV永久无码久久| 久久亚洲国产成人精品性色| 久久亚洲国产成人影院| 久久精品国产只有精品66| 久久超碰97人人做人人爱| 国产综合精品久久亚洲| 久久夜色精品国产噜噜麻豆| 久久亚洲国产成人影院|