設計模式在開發中的應用 -- 代理模式
阿新 • • 發佈:2018-12-11
代理模式
代理是一種模式,提供了對目標物件的間接訪問方式,即通過代理訪問目標物件。如此便於在
實現的基礎上增加額外的功能操作,前攔截,後攔截等,以滿足自身的業務需求,同時代理模式
便於擴充套件目標物件功能的特點也為多人所用。
靜態代理
靜態代理的實現比較簡單,代理類通過實現與目標物件相同的介面,並在類中維護一個代理對
象。通過構造器塞入目標物件,賦值給代理物件,進而執行代理物件實現的介面方法,並實現
前攔截,後攔截等所需的業務功能。
優缺點: 優點:可以做到不對目標物件進行修改的前提下,對目標物件進行功能的擴充套件和攔截。 缺點:因為代理物件,需要實現與目標物件一樣的介面,會導致代理類十分繁多,不易維護,同時一旦介面增加方法,則目標物件和代理類都需要維護。
動態代理
代理類在程式執行時建立的代理方式被成為 動態代理。 也就是說,這種情況下,代理類並不
是在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物件上