代理,想必大家都應該知道是什麼冬冬了,一般的手機產商都有代理商,歌星們都有自己的經紀人,如此這些都可以看作是一種代理模式。下面我選擇如下的一種情景來進行講述:某董事長出差,但是此時公司有個聚會,董事長買單,但是由他的秘書去結帳。我們就權且把這個看作一個代理行為,^_^。
首先我們定義一個接口:商人(Merchant),如下所示:
package cn.edu.hust.cm.test; public interface Merchant { void treat();//商人都要請客吃飯滴,^_^ } 然後我們定義一個類:董事長(Director),如下所示: package cn.edu.hust.cm.test; public class Director implements Merchant { public Director() { } public void treat() { System.out.println("董事長請大家吃飯"); } }
OK,我們現在要給他找代理了,這個代理就是他的秘書(Secretary)。這裡要涉及到一些代理的機制了。在Java中,用來做代理的類一般都要實現InvocationHandler,實現它的invoke方法,至於為啥是這樣俺也不知道了,^_^。另外,當我們產生一個代理實例(proxy instance)的時候,只要我們通過這個實例調用任何方法,都會導致invoke方法的調用,還是看例子吧,如下所示:
package cn.edu.hust.cm.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Secretary implements InvocationHandler { public Secretary(Director director) { this.director=director; } public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable { director.treat(); System.out.println("由秘書結帳咯!"); return null; } private Director director; }
現在我們開始構建我們的主體測試代碼,如下面的代碼所示:
package cn.edu.hust.cm.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class ProxyTest extends Proxy { public ProxyTest(InvocationHandler arg0) { super(arg0); } public static void main(String[] args) { Director director=new Director(); InvocationHandler secretary=new Secretary(director); Merchant merchant=(Merchant)Proxy.newProxyInstance(director.getClass().getClassLoader(),director.getClass().getInterfaces(),secretary); merchant.treat(); } }
運行程序,輸出將為:董事長請客
由秘書結帳咯!
這裡有幾個要說明的地方,如下所述:
1.Proxy.newProxyInstance方法的作用,它的作用為某個對象創建一個代理對象,本例中是為director創建了一個代理對象,這個對象屬於哪個類呢?我們在程序裡面加這樣一句System.out.println(merchant.getClass().getName()),輸出是$Proxy0,呵呵,說明已經產生了一個代理類了,這個類實現了director所屬類中的所有接口。
2.代理的實現機制問題。個人覺得這個似乎就是一個事件處理的機制,當代理對象調用某個方法的時候,就會觸發相應的invoke方法。因此Proxy.newProxyInstance方法的第三個參數就相當於給這個代理對象注冊了一個監聽器。
Proxy類還有幾個方法,用法可以查看相應的API文檔。