代理模式:是对象的结构模式,它给某个对象提供一个代理对象,并由代理对象控制对原对象的引用。
所谓代理,就是一个人或一个机构代表另一个人或另一个机构采取行动。
代理模式的结构:抽象主题、代理主题,真实主题。
(1)抽象主题
package com.javapatterns.proxy;
public abstract class Subject {
public abstract void request();
}
(2)真实主题
package com.javapatterns.proxy;
public class RealSubject extends Subject {
public RealSubject() {}
public void request() {
System.out.println("From real subject.");
}
}
(3)代理主题
package com.javapatterns.proxy;
public class ProxySubject extends Subject {
private RealSubject realSubject;
public ProxySubject() {}
public void request() {
preRequest();
if ( realSubject == null ) {
realSubject = new RealSubject();
}
realSubject.request();
postRequest();
}
}
怎样调用代理主题?
Subject subject = new ProxySubject();
subject.request();
Java 2.0对代理模式的支持
自从JDK 1.3,java.lang.reflect包提供了直接支持代理模式的3个类:Proxy、InvocationHandler,Method。
Proxy类使得设计师能够在运行时间创建代理对象,当系统有了一个代理对象后,对原对象的方法的调用,会分派给一个调用处理器(Invocation Handler)。程序可以在调用处理器的invoke()方法中截获这个调用。
package com.javapatterns.proxy.reflect;
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;
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("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");
}
}