代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。
简单实现UML结构如下:
- 抽象主题和真实主题都是实现了相同的接口,这样可以使可以使用真实主题的地方都可以使用代理主题。
- 代理主题内含有真实主题的引用,从而可以在任何时候操作真实主题。代理角色通常在将客户端调用传递给真是主题之前或者之后,都要执行某个操作,而不是单纯的将调用传递给真实主题对象。
调用代码如下:
Subject subject = new ProxySubject();
subject.request();
在Java 1.3版本中,开始提供了三个类来支持代理模式:
java.lang.reflect.InvocationHandler
java.lang.reflect.Proxy
java.lang.reflect.Method
其中实现了InvocationHandler的类提供了替代方法实现,要通过Proxy类来建立代理实例。
代码实现如下:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
import java.lang.reflect.Method;
import java.util.Vector;
import java.util.List;
public class VectorProxy implements InvocationHandler
{
private Object proxyobj;
/** @link dependency */
/*#Proxy lnkProxy;*/
public VectorProxy(Object obj)
{
proxyobj = obj;
}
public static Object factory(Object obj)
{
Class cls = obj.getClass();
return Proxy.newProxyInstance( cls.getClassLoader(),
cls.getInterfaces(),
new VectorProxy(obj) );
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
System.out.println(proxy.getClass().getName());
System.out.println("before calling " + method);
if (args != null)
{
for (int i=0; i<args.length; i++)
{
System.out.println(args[i] + "");
}
}
Object o = method.invoke(proxyobj, args);
System.out.println("after calling " + method);
return o;
}
public static void main(String[] args)
{
List v = null;
v = (List) factory(new Vector(10));
v.add("New");
v.add("York");
}
}