<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    waysun一路陽光

    不輕易服輸,不輕言放棄.--心是夢的舞臺,心有多大,舞臺有多大。踏踏實(shí)實(shí)做事,認(rèn)認(rèn)真真做人。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      167 隨筆 :: 1 文章 :: 64 評論 :: 0 Trackbacks
    收藏自:http://www.cnblogs.com/cf1504/archive/2008/12/15/1355103.html

    代理模式的作用是:為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標(biāo)對象之間起到中介的作用。

    代理模式一般涉及到的角色有:

    抽象角色:聲明真實(shí)對象和代理對象的共同接口;

    代理角色:代理對象角色內(nèi)部含有對真實(shí)對象的引用,從而可以操作真實(shí)對象,同時代理對象提供與真實(shí)對象相同的接口以便在任何時刻都能代替真實(shí)對象。同時,代理對象可以在執(zhí)行真實(shí)對象操作時,附加其他的操作,相當(dāng)于對真實(shí)對象進(jìn)行封裝。

    真實(shí)角色:代理角色所代表的真實(shí)對象,是我們最終要引用的對象。

     適用環(huán)境:要獲得已經(jīng)初始化的對象又不能有具體的獲得途徑時適用。

    以下以《Java與模式》中的示例為例:

    抽象角色:

    abstract   public   class  Subject  {
       
    abstract   public   void  request(); 
    }
      


    真實(shí)角色:實(shí)現(xiàn)了Subject的request()方法。

    public   class  RealSubject  extends  Subject 
        
    public  RealSubject()  { }  
        
        
    public   void  request() 
            System.out.println(
    " From real subject. " ); 
        }
     
    }
     


    代理角色: 

    public   class  ProxySubject  extends  Subject 
        
    private  RealSubject realSubject;  // 以真實(shí)角色作為代理角色的屬性 

        
    public  ProxySubject()  { }  


        
    public   void  request()  // 該方法封裝了真實(shí)對象的request方法 
            preRequest(); 

            
    if ( realSubject  ==   null  ) 

                realSubject 
    =   new  RealSubject(); 
            }
     

            realSubject.request(); 
    // 此處執(zhí)行真實(shí)對象的request方法 

            postRequest(); 
        }



      客戶端調(diào)用:

    Subject sub = new  ProxySubject(); 
    Sub.request(); 

    由 以上代碼可以看出,客戶實(shí)際需要調(diào)用的是RealSubject類的request()方法,現(xiàn)在用ProxySubject來代理 RealSubject類,同樣達(dá)到目的,同時還封裝了其他方法(preRequest(),postRequest()),可以處理一些其他問題。

    另 外,如果要按照上述的方法使用代理模式,那么真實(shí)角色必須是事先已經(jīng)存在的,并將其作為代理對象的內(nèi)部屬性。但是實(shí)際使用時,一個真實(shí)角色必須對應(yīng)一個 代理角色,如果大量使用會導(dǎo)致類的急劇膨脹;此外,如果事先并不知道真實(shí)角色,該如何使用代理呢?這個問題可以通過Java的動態(tài)代理類來解決。
     
    2.動態(tài)代理類

    Java動態(tài)代理類位于Java.lang.reflect包下,一般主要涉及到以下兩個類:

    (1). Interface InvocationHandler:該接口中僅定義了一個方法Object:invoke(Object obj,Method method, Object[] args)。在實(shí)際使用時,第一個參數(shù)obj一般是指代理類,method是被代理的方法,如上例中的request(),args為該方法的參數(shù)數(shù)組。 這個抽象方法在代理類中動態(tài)實(shí)現(xiàn)。


    (2).Proxy:該類即為動態(tài)代理類,作用類似于上例中的ProxySubject,其中主要包含以下內(nèi)容:

    Protected Proxy(InvocationHandler h):構(gòu)造函數(shù),估計用于給內(nèi)部的h賦值。

    Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個代理類,其中l(wèi)oader是類裝載器,interfaces是真實(shí)類所擁有的全部接口的數(shù)組。

    Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個實(shí)例,返回后的代理類可以當(dāng)作被代理類使用(可使用被代理類的在Subject接口中聲明過的方法)。

     

    所 謂Dynamic Proxy是這樣一種class:它是在運(yùn)行時生成的class,在生成它時你必須提供一組interface給它,然后該class就宣稱它實(shí)現(xiàn)了這些 interface。你當(dāng)然可以把該class的實(shí)例當(dāng)作這些interface中的任何一個來用。當(dāng)然啦,這個Dynamic Proxy其實(shí)就是一個Proxy,它不會替你作實(shí)質(zhì)性的工作,在生成它的實(shí)例時你必須提供一個handler,由它接管實(shí)際的工作。

    在使用動態(tài)代理類時,我們必須實(shí)現(xiàn)InvocationHandler接口,以第一節(jié)中的示例為例:

     


    抽象角色(之前是抽象類,此處應(yīng)改為接口): 

    public   interface  Subject 
       
    abstract   public   void  request(); 
    }
     



    具體角色RealSubject:
    public   class  RealSubject  implements  Subject {

      
    public  RealSubject() {}

      
    public   void  request() {
        System.out.println(
    " From real subject. " );
      }


    }
     


    代理處理器:

    import  java.lang.reflect.Method;

    import  java.lang.reflect.InvocationHandler;

    public   class  DynamicSubject  implements  InvocationHandler  {
      
    private  Object sub;
      
    public  DynamicSubject()  {}

      
    public  DynamicSubject(Object obj)  {
        sub 
    =  obj;
      }


    public  Object invoke(Object proxy, Method method, Object[] args)  throws  Throwable  {
       System.out.println(
    " before calling  "   +  method);
       method.invoke(sub,args);

       System.out.println(
    " after calling  "   +  method);
       
    return   null ;
     }


    }


     

    該代理類的內(nèi)部屬性為Object類,實(shí)際使用時通過該類的構(gòu)造函數(shù)DynamicSubject(Object obj)對其賦值;此外,在該類還實(shí)現(xiàn)了invoke方法,該方法中的

    method.invoke(sub,args);

    其實(shí)就是調(diào)用被代理對象的將要被執(zhí)行的方法,方法參數(shù)sub是實(shí)際的被代理對象,args為執(zhí)行被代理對象相應(yīng)操作所需的參數(shù)。通過動態(tài)代理類,我們可以在調(diào)用之前或之后執(zhí)行一些相關(guān)操作。

    客戶端:

     

    import  java.lang.reflect.InvocationHandler; 
    import  java.lang.reflect.Proxy; 
    import  java.lang.reflect.Constructor; 
    import  java.lang.reflect.Method; 

    public   class  Client 

    static   public   void  main(String[] args)  throws  Throwable 

       RealSubject rs 
    =   new  RealSubject();  // 在這里指定被代理類 
       InvocationHandler ds  =   new  DynamicSubject(rs); 
       Class cls 
    =  rs.getClass(); 

       
    // 以下是一次性生成代理
       Subject subject  =  (Subject) Proxy.newProxyInstance(cls.getClassLoader(), cls.getInterfaces(),ds ); 
       subject.request(); 

    }
     

    posted on 2009-10-12 09:50 weesun一米陽光 閱讀(187) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲综合伊人久久大杳蕉| 久久精品国产精品亚洲毛片| 巨胸喷奶水视频www免费视频| 亚洲色欲一区二区三区在线观看| 91精品导航在线网址免费| 亚洲乱理伦片在线观看中字| 亚洲日韩中文字幕在线播放| 台湾一级毛片永久免费| 一级毛片视频免费观看| 亚洲男人都懂得羞羞网站| 成人免费无码精品国产电影| 久久精品视频免费| 亚洲熟妇无码AV| 亚洲av无码av制服另类专区| 国产免费看插插插视频| 亚洲免费精彩视频在线观看| 自拍偷自拍亚洲精品偷一| 亚洲午夜久久久精品影院| 亚洲JIZZJIZZ中国少妇中文| 亚洲视频在线免费看| 国产精品成人69XXX免费视频| 亚洲一区二区三区久久久久| 亚洲午夜未满十八勿入网站2| 天天摸天天操免费播放小视频| 99麻豆久久久国产精品免费 | 亚洲综合色一区二区三区| 亚洲熟妇丰满多毛XXXX| 成人午夜视频免费| 日韩免费高清大片在线| 免费人成又黄又爽的视频在线电影| 亚洲中文久久精品无码1| 亚洲色欲色欲www在线丝| 免费jlzzjlzz在线播放视频| 91精品免费在线观看| 成人久久免费网站| 一级毛片免费在线播放| 久久亚洲中文字幕无码| 中文字幕亚洲综合小综合在线| 亚洲精品自产拍在线观看动漫| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 亚洲校园春色小说|