代理,想必大家都應該知道是什麼冬冬了,一般的手機產商都有代理商,歌星們都有自己的經紀人,如此這些都可以看作是一種代理模式。下面我選擇如下的一種情景來進行講述:某董事長出差,但是此時公司有個聚會,董事長買單,但是由他的秘書去結帳。我們就權且把這個看作一個代理行為,^_^。
首先我們定義一個接口:商人(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文檔。