概述
代理模式(Proxy Pattern)
是一种结构型设计模式,它允许通过代理对象来控制对其他对象的访问。代理对象通常会在实际对象的方法调用前后进行一些额外的操作,比如延迟实例化、安全检查、日志记录等。
使用场景
- 当你需要在访问对象前后添加额外操作时,比如日志记录、性能监控、安全检查等。
- 当你需要控制对某个对象的访问权限时。
结构
代理模式包含以下几个部分:
- 抽象主题(Subject):定义了真实对象和代理对象的公共接口。
- 真实主题(RealSubject):实现了抽象主题接口,是具体的业务实现对象。
- 代理(Proxy):持有一个对真实对象的引用,并实现了抽象主题接口,通过代理对象控制对真实对象的访问。
代码实现
静态代理
// 抽象主题
interface Subject {
void request();
}
// 真实主题
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 代理
class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(){
realSubject = new RealSubject();
}
@Override
public void request() {
System.out.println("Proxy: Logging before request.");
realSubject.request();
System.out.println("Proxy: Logging after request.");
}
}
// 客户端代码
public class StaticProxyDemo {
public static void main(String[] args) {
Subject proxy = new Proxy();
proxy.request();
}
}
JDK实现动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 抽象主题
interface Subject {
void request();
}
// 真实主题
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 动态代理处理器
class DynamicProxyHandler implements InvocationHandler {
private Object realSubject;
public DynamicProxyHandler(Object realSubject) {
this.realSubject = realSubject;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Proxy: Logging before request.");
Object result = method.invoke(realSubject, args);
System.out.println("Proxy: Logging after request.");
return result;
}
}
// 客户端代码
public class JDKDynamicProxyDemo {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Subject proxyInstance = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
new DynamicProxyHandler(realSubject));
proxyInstance.request();
}
}
CGLIB实现动态代理
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
// 真实主题
class RealSubject {
public void request() {
System.out.println("RealSubject: Handling request.");
}
}
// 动态代理处理器
class CglibProxyHandler implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Proxy: Logging before request.");
Object result = proxy.invokeSuper(obj, args);
System.out.println("Proxy: Logging after request.");
return result;
}
}
// 客户端代码
public class CGLIBProxyDemo {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(RealSubject.class);
enhancer.setCallback(new CglibProxyHandler());
RealSubject proxy = (RealSubject) enhancer.create();
proxy.request();
}
}