代理模式(Proxy,这里侧重于Dynamic Proxy)可以理解成给一个对象提供一个代理对象,这个代理对象就是把原对象进行包装,使其与调用处理器相关联。
因为代理对象和真实对象具有相同的接口,客户访问时,通过接口调用代理实例的方法,这个调用会被分发到该实例对应的处理器。处理器在把客户端调用传递给真实的对象之前或者之后,可执行某个操作,也可以选择不把这个调用传递给真实的对象。
产生代理对象的过程就是将原对象和调用处理器邦定的过程,如下:
Proxy.newProxyInstance(真实对象实例.getClass().getClassLoader(), 真实对象实例.getClass().getInterfaces(), 与真实对象关联的调用处理器实例);
示例:
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();
}
}