我對(duì)設(shè)計(jì)模式的理解:Dynamic Proxy模式
代理模式(Proxy,這里側(cè)重于Dynamic Proxy)可以理解成給一個(gè)對(duì)象提供一個(gè)代理對(duì)象,這個(gè)代理對(duì)象就是把原對(duì)象進(jìn)行包裝,使其與調(diào)用處理器相關(guān)聯(lián)。
??? 因?yàn)榇韺?duì)象和真實(shí)對(duì)象具有相同的接口,客戶訪問時(shí),通過接口調(diào)用代理實(shí)例的方法,這個(gè)調(diào)用會(huì)被分發(fā)到該實(shí)例對(duì)應(yīng)的處理器。處理器在把客戶端調(diào)用傳遞給真實(shí)的對(duì)象之前或者之后,可執(zhí)行某個(gè)操作,也可以選擇不把這個(gè)調(diào)用傳遞給真實(shí)的對(duì)象。
???
???產(chǎn)生代理對(duì)象的過程就是將原對(duì)象和調(diào)用處理器邦定的過程,如下:
Proxy.newProxyInstance(真實(shí)對(duì)象實(shí)例.getClass().getClassLoader(), 真實(shí)對(duì)象實(shí)例.getClass().getInterfaces(),?與真實(shí)對(duì)象關(guān)聯(lián)的調(diào)用處理器實(shí)例);
?? 示例:
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();
?}
}
posted on 2006-04-29 14:12 crazycy 閱讀(1023) 評(píng)論(0) 編輯 收藏 所屬分類: Design Pattern、JEE Pattern