亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java代理機制

2019-11-06 06:11:56
字體:
來源:轉載
供稿:網友

學習java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!

Table of Contents

1 引言2 常見的代理3 代理模式UML圖4 代理模式實例5 java動態代理5.1 java動態代理UML圖6 代理模式與裝飾者模式的區別6.1 裝飾者模式UML圖6.2 形象說明

1 引言

我們書寫執行一個功能的函數時,經常需要在其中寫入與功能不是直接相關但很有必要的代 碼,如日志記錄,信息發送,安全和事務支持等,這些枝節性代碼雖然是必要的,但它會帶 來以下麻煩:

枝節性代碼游離在功能性代碼之外,它下是函數的目的,這是對OO是一種破壞枝節性代碼會造成功能性代碼對其它類的依賴,加深類之間的耦合,而這是OO系統所竭 力避免的枝節性代碼帶來的耦合度會造成功能性代碼移植困難,可重用性降低從法理上說,枝節性代碼應該`監視'著功能性代碼,然后采取行動,而不是功能性代碼 `通知'枝節性代碼采取行動,這好比吟游詩人應該是主動記錄騎士的功績而不是騎士主 動要求詩人記錄自己的功績

2 常見的代理

毫無疑問,枝節性代碼和功能性代碼需要分開來才能降低耦合程度,符合現代OO系統的要 求,我們可以使用代理模式完成這個要求。

代理模式的作用是:為其它對象提供一種代理以控制對這個對象的訪問。在某些情況下,一 個客戶不想直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介作用。 代理模式一般涉及到三個角色:

抽象角色:聲明真實對象和代理對象的共同接口代理角色:代理對象內部包含有真實角色的引用,從而可以操作真實角色,同時代理對象 與真實對象有相同的接口,能在任何時候代替真實對象,同時代理對象可以在執行真實對 象前后加入特定的邏輯以實現功能的擴展。真實角色:代理角色所代表的真實對象,是我們最終要引用的對象

常見的代理有:

遠程代理(Remote PRoxy):對一個位于不同的地址空間對象提供一個局域代表對象,如RMI中的stub虛擬代理(Virtual Proxy):根據需要將一個資源消耗很大或者比較復雜的對象,延遲加 載,在真正需要的時候才創建保護代理(Protect or access Proxy):控制對一個對象的訪問權限。智能引用(Smart Reference Proxy):提供比目標對象額外的服務和功能。

通過代理類這一中間層,能夠有效控制對實際委托類對象的直接訪問,也可以很好地隱藏和 保護實際對象,實施不同的控制策略,從而在設計上獲得了更大的靈活性。

3 代理模式UML圖

代理是一種常用的設計模式,其目的就是為其他對象提供一個代理以控制對某個對象的訪問。 代理類負責為委托類預處理消息,過濾消息并轉發消息,以及進行消息被委托類執行后的后 續處理。

latex-table

4 代理模式實例

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

// 抽象角色:abstract public class Subject {    abstract public void  request();}// 真實角色:實現了Subject的request()方法public class  RealSubject  extends  Subject  {  public  RealSubject()  { }  public void  request()  {     System.out.println( " From real subject. " );    }}// 代理角色:public class  ProxySubject  extends  Subject  {  // 以真實角色作為代理角色的屬性  private  Subject realSubject;  public  ProxySubject(Subject realSubject)  {this.realSubject = realSubject }  // 該方法封裝了真實對象的request方法  public void  request()  {     preRequest();     realSubject.request();  // 此處執行真實對象的request方法     postRequest();  }  ...}// 客戶端調用:RealSubject real = new RealSubject();Subject sub = new  ProxySubject(real);Sub.request();

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

另外,如果要按照上述的方法使用代理模式,那么真實角色必須是事先已經存在的,并將其 作為代理對象的內部屬性。但是實際使用時,如果某一個代理要應用于-批真實角色,毎個 真實對象必須對應一個代理角色,如果大量使用會導致類的急劇膨脹;此外,如果事先并不 知道真實角色,該如何使用編寫代理類呢?這個問題可以通過java的動態代理類來解決。

5 java動態代理

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

5.1 java動態代理UML圖

latex-table

java動態代理類位于java.lang.reflect包下,一般主要涉及到以下兩個類:

Interface InvocationHandler:該接口中僅定義了一個方法Object:invoke(Object obj,Method method, Object[] args)。在實際使用時,第一個參數obj一般是指代理 類,method是被代理的方法,如上例中的request(),args為該方法的參數數組。 這個抽 象方法在代理類中動態實現。Proxy:該類即為動態代理類,作用類似于上例中的ProxySubject。Protected Proxy(InvocationHandler h):構造函數,估計用于給內部的h賦值。Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個 代理類,其中loader是類裝載器,interfaces是真實類所擁有的全部接口的數組。Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個實例,返回后的代理類可以當作被代理類使用 (可使用被代理類的在Subject接口中聲明過的方法)。

在使用動態代理類時,我們必須實現InvocationHandler接口,以第一節中的示例為例:

// 抽象角色(之前是抽象類,此處應改為接口):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 ;  }}

該代理類的內部屬性為Object類,實際使用時通過該類的構造函數DynamicSubject(Object obj)對其賦值;此外,在該類還實現了invoke方法,該方法中的

method.invoke(sub,args);

其實就是調用被代理對象的將要被執行的方法,方法參數sub是實際的被代理對象,args為執 行被代理對象相應操作所需的參數。通過動態代理類,我們可以在調用之前或之后執行一些 相關操作。

// 客戶端: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();  }}// 程序運行結果:before calling public abstract void Subject.request()From real subject.after calling public abstract void Subject.request()

通過這種方式,被代理的對象(RealSubject)可以在運行時動態改變,需要控制的接口 (Subject接口)可以在運行時改變,控制的方式(DynamicSubject類)也可以動態改變,從而實 現了非常靈活的動態代理關系。

6 代理模式與裝飾者模式的區別

代理模式和裝飾者模式很像,在典型的例子上,如spring的AOP、遠程代理類、JDK的proxy, 都是代理模式。JDK里的輸入/輸出器是很典型的裝飾器模式!但在有些場景上,對設計模式 入門的新手,還是有點難區分,UML類圖基本沒區別,都是實現同一個接口,一個類包裝另一 個類。 兩者的定義:

裝飾器模式:能動態的新增或組合對象的行為代理模式:為其他對象提供一種代理以控制對這個對象的訪問

裝飾模式是“新增行為”,而代理模式是“控制訪問”。關鍵就是我們如何判斷是“新增行 為”還是“控制訪問”。你在一個地方寫裝飾,大家就知道這是在增加功能,你寫代理,大 家就知道是在限制。

6.1 裝飾者模式UML圖

latex-table

其中類的職責如下:

抽象構件角色(Project):給出一個接口,以規范準備接收附加責任的對象具體構件角色(Employe):定義一個將要接收附加責任的類裝飾角色(Manager):持有一個構件對象的實例,并定義一個與抽象構件接口一致的接口具體裝飾角色(ManagerA、ManagerB):負責給構件對象“貼上”附加的責任

6.2 形象說明

代理模式:在不改變接口的前提下,控制對象的訪問

例子:孫悟空扮演并代替高家三小姐

孫悟空扮演高家三小姐,所以可以說孫悟空與高家三小姐具有共同的接口。如果豬八戒只想 見見高家三小姐的嬌好面容,或者談談天說說地,那么高家三小姐的“代理”孫悟空是允許 的,但豬八戒想親親嘴,那么是不行的。這是保護代理模式的應用。只有代理對象認為合適 時,才會將客戶端的請求傳遞給真實主題對象。

裝飾模式:在不改變接口的前提下,動態擴展對象的功能

孫悟空有七十二般變化,在二郎神眼里,他永遠是那只猢猻。裝飾模式以對客戶透明的方式 動態地給一個對象附加上更多的責任。換言之,客戶端并不會覺得對象在裝飾前和裝飾后有 什么不同。裝飾模式可以在不使用創造更多子類的情況下,將對象的功能加以擴展。他的每 一種變化都給他帶來一種附加的本領。他變成魚兒時,就可以到水里游泳;他變成雀兒時, 就可以在天上飛行。而不管悟空怎么變化,在二郎神眼里,他永遠是那只猢猻。裝飾模式以 對客戶透明的方式動態地給一個對象附加上更多的責任。換言之,客戶端并不會覺得對象在 裝飾前和裝飾后有什么不同。裝飾模式可以在不使用創造更多子類的情況下,將對象的功能 加以擴展。

學習Java的同學注意了?。?! 學習過程中遇到什么問題或者想獲取學習資源的話,歡迎加入Java學習交流群,群號碼:523047986  我們一起學Java!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品悠悠久久琪琪| 亚洲欧美综合另类中字| 欧美成人激情视频| 午夜精品久久久久久久男人的天堂| 日韩欧美在线免费观看| 亚洲电影免费观看| 91麻豆桃色免费看| 久久99精品国产99久久6尤物| 国产精品扒开腿爽爽爽视频| 亚洲性视频网站| 成人写真福利网| 国产视频欧美视频| 国产91免费观看| 亚洲社区在线观看| 自拍偷拍免费精品| 青草青草久热精品视频在线网站| 欧美极品少妇xxxxⅹ免费视频| 亚洲第一视频在线观看| 国产亚洲免费的视频看| 久久久精品国产| 97在线看免费观看视频在线观看| 国产主播欧美精品| 综合欧美国产视频二区| 中文字幕久久久| 亚洲精品wwww| 国产亚洲视频在线| 亚洲影院色无极综合| 97在线视频观看| 亚洲丝袜一区在线| 久久免费成人精品视频| 久久99国产精品久久久久久久久| 国产精品成人在线| 欧美国产欧美亚洲国产日韩mv天天看完整| 国内精品小视频| 日韩电视剧免费观看网站| 久久久久国产视频| 国产91精品最新在线播放| 欧美激情视频播放| 国产视频精品xxxx| 久久亚洲一区二区三区四区五区高| 国产一区二区三区日韩欧美| 国产精品视频不卡| 日韩大陆欧美高清视频区| 日本精品va在线观看| 亚洲jizzjizz日本少妇| 欧美激情极品视频| 久久久人成影片一区二区三区| 国产精品视频白浆免费视频| 欧美激情视频网址| 国内精品一区二区三区| 91精品国产91久久| 在线观看91久久久久久| 久久久国产91| 亚洲第一福利视频| 日韩高清免费观看| 九九九久久国产免费| 韩曰欧美视频免费观看| 国产精品27p| 国产精品自拍偷拍视频| 久久精品成人动漫| 久久免费福利视频| 精品女厕一区二区三区| 久久久成人的性感天堂| 中文字幕日韩av综合精品| 亚洲精品久久久久中文字幕欢迎你| 欧亚精品中文字幕| 日韩专区在线播放| 国产一区二区三区直播精品电影| 欧美精品999| 国产亚洲欧美另类中文| 国产91在线播放精品91| 成人精品在线观看| 98精品国产自产在线观看| 久久99精品久久久久久噜噜| 一本色道久久88亚洲综合88| 丝袜一区二区三区| 久久青草精品视频免费观看| 成人性生交大片免费看小说| 亚洲free性xxxx护士白浆| www国产亚洲精品久久网站| 亚洲奶大毛多的老太婆| 全亚洲最色的网站在线观看| 日韩视频精品在线| 91精品视频在线播放| 久久在线精品视频| 久久成人一区二区| 一区三区二区视频| 欧美日韩在线免费| 日韩麻豆第一页| 久久av中文字幕| 欧美性猛交xxxx乱大交蜜桃| 俺去啦;欧美日韩| 国产精品高潮呻吟久久av黑人| 亚洲美女av在线播放| 亚洲国产成人精品久久| 日韩av综合中文字幕| 国产suv精品一区二区三区88区| 久久精品国产一区二区电影| 国产成人福利视频| 91国在线精品国内播放| 日产精品99久久久久久| 欧美激情综合色| 日韩亚洲国产中文字幕| 欧美第一淫aaasss性| 亚洲一区国产精品| www.欧美精品一二三区| 国产精品久久国产精品99gif| 欧美资源在线观看| 精品亚洲男同gayvideo网站| 91久久久久久| 日本在线观看天堂男亚洲| 亚洲色图欧美制服丝袜另类第一页| 久久久精品视频在线观看| 国产精品视频最多的网站| 亚洲精品成人网| 久久99精品国产99久久6尤物| 国产日韩中文字幕在线| 日韩成人激情在线| 欧美精品18videos性欧美| 97在线观看视频国产| 国产色婷婷国产综合在线理论片a| 久久精品男人天堂| 亚洲经典中文字幕| 欧美精品激情在线| 国产精品影片在线观看| 国产精品激情自拍| 91极品视频在线| 国产精品一区二区三区在线播放| 国产成人亚洲综合91| 69久久夜色精品国产7777| 国产欧美一区二区| 亚洲第一福利在线观看| 日韩在线视频二区| 福利视频第一区| 81精品国产乱码久久久久久| 亚洲free性xxxx护士hd| 日韩av中文字幕在线播放| 中日韩美女免费视频网址在线观看| 国产精品pans私拍| 亚洲亚裔videos黑人hd| 国产成人久久久精品一区| 成人精品视频99在线观看免费| 欧美日韩福利视频| 欧美亚洲视频在线观看| 亚洲japanese制服美女| 国产精品久久综合av爱欲tv| 欧美在线视频一区二区| 国产精品福利无圣光在线一区| 久久综合国产精品台湾中文娱乐网| 欧美视频二区36p| 欧美一级黄色网| 欧美在线xxx| 亚洲一区国产精品| 国产成人鲁鲁免费视频a| 亚洲片国产一区一级在线观看| 亚洲精品久久久久久下一站| 2020欧美日韩在线视频| 国产一区二区三区在线播放免费观看| 国产视频精品久久久| 日本久久亚洲电影| 日韩一区二区三区国产| 1769国内精品视频在线播放| 欧美一区深夜视频| 欧美亚洲第一页|