代理模式(Proxy Design Pattern)在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。
代理模式的关键角色包括:
代理模式可以应用于许多场景,以下是几个常见的应用场景:
需要注意的是,代理模式并非适用于所有情况。在某些场景下,代理模式可能引入额外的复杂性和性能开销,需要根据具体问题和需求来决定是否使用代理模式。
代理模式的实现方式有多种,常见的有静态代理和动态代理两种形式:
// 抽象主题
public interface Subject {
void request();
}
// 目标对象
@Slf4j
public class RealSubject implements Subject {
@Override
public void request() {
// 具体业务逻辑
LOGGER.info("开始处理请求");
}
}
@Slf4j
public class Proxy implements Subject {
private Subject realSubject;
public Proxy(Subject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
LOGGER.info("前置处理逻辑");
// 执行一些额外的操作
realSubject.request();
// 执行一些额外的操作
LOGGER.info("后置处理逻辑");
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Subject realSubject = new RealSubject(); // 创建目标对象
Subject proxy = new Proxy(realSubject); // 创建代理对象
proxy.request(); // 通过代理对象调用目标对象的方法
}
}
java.lang.reflect.Proxy
类和 java.lang.reflect.InvocationHandler
接口实现。// 抽象主题
public interface Subject {
void request();
}
// 目标对象
@Slf4j
public class RealSubject implements Subject {
@Override
public void request() {
// 具体业务逻辑
LOGGER.info("开始处理请求");
}
}
// InvocationHandler 实现类
public class DynamicProxy implements InvocationHandler {
private Object target;
public DynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 执行一些额外的操作
LOGGER.info("前置处理逻辑");
Object result = method.invoke(target, args);
// 执行一些额外的操作
LOGGER.info("后置处理逻辑");
return result;
}
}
// 客户端
public class Client {
public static void main(String[] args) {
Subject realSubject = new RealSubject(); // 创建目标对象
InvocationHandler handler = new DynamicProxy(realSubject); // 创建 InvocationHandler 实现类
Subject proxy = (Subject) Proxy.newProxyInstance(
realSubject.getClass().getClassLoader(),
realSubject.getClass().getInterfaces(),
handler
); // 创建动态代理对象
proxy.request(); // 通过代理对象调用目标对象的方法
}
}
以上内容基于GPT创建和整理。
来自一线全栈程序员nine的八年探索与实践,持续迭代中。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。