(三)代理模式

 

 

推薦博客:代理模式原理及實例講解html

 

 (1)代理模式:java

  (1) 代理模式是使用代理對象完成用戶請求,屏蔽用戶對真實對象的訪問安全

   好比:現實世界的代理人被受權執行當事人的一些事宜,無需當事人出面,從第三方的額角度看,彷佛當事人並不存在,由於他只和代理人通訊。而事實上,代理人要有當事人受權而且在覈心問題上請示當事人。函數

  (2)在軟件設計中:使用代理模式的意圖也不少,好比性能

  1. 由於安全緣由須要屏蔽客戶端直接訪問真實對象;
  2. 在遠程調用中須要使用代理類處理遠程方法調用技術細節,
  3. 爲了提升系統性能,對真實對象進行封裝,從而達到延遲加載的目的;

    (2)代理模式角色劃分:設計

           

  1. 主題接口:定義代理類和真實主題的公共對外方法,也是代理類代理真實主題的方法;代理

  2. 真實主題:真正實現業務邏輯的類;htm

  3. 代理類:用來代理和封裝真實主題;對象

  4. Main:客戶端,使用代理類和主題接口完成一些工做。blog

 (3)分類:

     1,靜態代理:

 靜態代理的實現模式通常是:首先建立一個接口(JDK代理都是面向接口的),而後建立具體實現類來實現這個接口,而後再建立一個代理類一樣實現這個接口,不一樣之處在於,具體實現類的方法中須要將接口中定義的方法的業務邏輯功能實現,而代理類中的方法只要調用具體類中的對應方法便可,這樣咱們在須要使用接口中的某個方法的功能時直接調用代理類的方法便可,將具體的實現類隱藏在底層。

個人理解:因爲Cinema(代理類)是事先編寫、編譯好的,而不是在程序運行過程當中動態生成的,所以這個例子是一個靜態代理的應用。

     2,動態代理:

        動態代理能夠在程序運行期間根據須要動態的建立代理類及其實例來完成具體的功能

(4)總結

    一個典型的動態代理建立對象過程可分爲如下四個步驟:

一、經過實現InvocationHandler接口建立本身的調用處理器 IvocationHandler handler = new InvocationHandlerImpl(...);
二、經過爲Proxy類指定ClassLoader對象和一組interface建立動態代理類
Class clazz = Proxy.getProxyClass(classLoader,new Class[]{...});
三、經過反射機制獲取動態代理類的構造函數,其參數類型是調用處理器接口類型
Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
四、經過構造函數建立代理類實例,此時需將調用處理器對象做爲參數被傳入
Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
爲了簡化對象建立過程,Proxy類中的newInstance方法封裝了2~4,只需兩步便可完成代理對象的建立。
生成的ProxySubject繼承Proxy類實現Subject接口,實現的Subject的方法實際調用處理器的invoke方法,而invoke方法利用反射調用的是被代理對象的的方法(Object result=method.invoke(proxied,args))

美中不足

誠然,Proxy已經設計得很是優美,可是仍是有一點點小小的遺憾之處,那就是它始終沒法擺脫僅支持interface代理的問題,由於它的設計註定了這個遺憾。回想一下那些動態生成的代理類的繼承關係圖,它們已經註定有一個共同的父類叫Proxy。Java的繼承機制註定了這些動態代理類們沒法實現對class的動態代理,緣由是多繼承在Java中本質上就行不通。有不少條理由,人們能夠否認對 class代理的必要性,可是一樣有一些理由,相信支持class動態代理會更美好。接口和類的劃分,本就不是很明顯,只是到了Java中才變得如此的細化。若是隻從方法的聲明及是否被定義來考量,有一種二者的混合體,它的名字叫抽象類。實現對抽象類的動態代理,相信也有其內在的價值。此外,還有一些歷史遺留的類,它們將由於沒有實現任何接口而今後與動態代理永世無緣。如此種種,不得不說是一個小小的遺憾。可是,不完美並不等於不偉大,偉大是一種本質,Java動態代理就是佐例。

相關文章
相關標籤/搜索