代理模式(Proxy,這里側(cè)重于Dynamic Proxy)可以理解成給一個對象提供一個代理對象,這個代理對象就是把原對象進行包裝,使其與調(diào)用處理器相關(guān)聯(lián)。
??? 因為代理對象和真實對象具有相同的接口,客戶訪問時,通過接口調(diào)用代理實例的方法,這個調(diào)用會被分發(fā)到該實例對應(yīng)的處理器。處理器在把客戶端調(diào)用傳遞給真實的對象之前或者之后,可執(zhí)行某個操作,也可以選擇不把這個調(diào)用傳遞給真實的對象。
???
???產(chǎn)生代理對象的過程就是將原對象和調(diào)用處理器邦定的過程,如下:
Proxy.newProxyInstance(真實對象實例.getClass().getClassLoader(), 真實對象實例.getClass().getInterfaces(),?與真實對象關(guān)聯(lián)的調(diào)用處理器實例);
?? 示例:
public interface AnInterface {
?void say();
}
public class AClass implements AnInterface {
?public AClass() {
??System.out.println("AClass:AClass()");
?}
?public void say() {
??System.out.println("AClass:say()");
?}
}
public class MyHandler implements InvocationHandler {
?private Object realObj;
?private MyHandler() {
??}
?public Object bind(Object realObj) {
????this.realObj = realObj;
??? return Proxy.newProxyInstance(realObj.getClass().getClassLoader(),
????realObj.getClass().getInterfaces(),?this);
?}
?public Object invoke(Object proxy, Method md, Object[] args) throws Throwable {
??Object obj = null;
??System.out.println("invoke()");
??obj = md.invoke(realObj, args);
??return obj;
?}
}
public class Test {
?public static void main(String[] args) {
? MyHandler??handler = new MyHandler?();
? AnInterface?proxyObj = handler.bind(new AClass());
??proxyObj.say();
?}
}