1. 程式人生 > >設計模式在開發中的應用 -- 代理模式

設計模式在開發中的應用 -- 代理模式

代理模式

  代理是一種模式,提供了對目標物件的間接訪問方式,即通過代理訪問目標物件。如此便於在
實現的基礎上增加額外的功能操作,前攔截,後攔截等,以滿足自身的業務需求,同時代理模式
便於擴充套件目標物件功能的特點也為多人所用。

靜態代理

靜態代理的實現比較簡單,代理類通過實現與目標物件相同的介面,並在類中維護一個代理對
象。通過構造器塞入目標物件,賦值給代理物件,進而執行代理物件實現的介面方法,並實現
前攔截,後攔截等所需的業務功能。

優缺點: 優點:可以做到不對目標物件進行修改的前提下,對目標物件進行功能的擴充套件和攔截。 缺點:因為代理物件,需要實現與目標物件一樣的介面,會導致代理類十分繁多,不易維護,同時一旦介面增加方法,則目標物件和代理類都需要維護。

動態代理

    代理類在程式執行時建立的代理方式被成為 動態代理。 也就是說,這種情況下,代理類並不
是在Java程式碼中定義的,而是在執行時根據我們在Java程式碼中的“指示”動態生成的。相比於靜態
代理, 動態代理的優勢在於可以很方便的對代理類的函式進行統一的處理,而不用修改每個代
理類的函式。

在java的動態代理機制中,有兩個重要的類或介面,一個是 InvocationHandler(Interface)、另一個則是 Proxy(Class),這一個類和介面是實現我們動態代理所必須用到的

InvocationHandler這個介面的唯一一個方法 invoke 方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable	
proxy:  指代我們所代理的那個真實物件
method:  指代的是我們所要呼叫真實物件的某個方法的Method物件
args:  指代的是呼叫真實物件某個方法時接受的引數

public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

loader:一個ClassLoader物件,定義了由哪個ClassLoader物件來對生成的代理物件進行加
		載
interfaces:一個Interface物件的陣列,表示的是我將要給我需要代理的物件提供一組什麼接
           口,如果我提供了一組介面給它,那麼這個代理物件就宣稱實現了該介面(多型),
           這樣我就能呼叫這組介面中的方法了
h: 一個InvocationHandler物件,表示的是當我這個動態代理物件在呼叫方法的時候,會關聯
到哪一個InvocationHandler物件上