代理模式
代理模式(Proxy Pattern) 是一种 结构型设计模式,它通过提供一个代理对象来控制对目标对象的访问。
核心组成
- Subject(抽象主题):定义目标对象和代理对象的公共接口,客户端通过该接口访问对象。
- RealSubject(真实主题): 实现了具体业务逻辑的对象,是被代理的对象。
- Proxy(代理):持有 RealSubject 的引用,在调用前后可以添加额外操作。
使用场景
应用领域 | 示例 |
---|---|
Spring AOP | Spring 使用动态代理实现切面编程(如日志、事务、安全) |
远程调用框架 | 如 Dubbo、gRPC 中的远程服务代理 |
数据库连接池 | 如 HikariCP、Druid 使用代理封装 Connection |
权限控制 | 如 Shiro、Spring Security 中的方法级权限控制 |
图片/资源加载 | 虚拟代理用于延迟加载大资源,如图片、视频等 |
缓存中间件 | 使用代理缓存方法结果,如 Redis + 代理实现缓存机制 |
示例:
抽象主题接口:
java
public interface Subject {
/**
* 执行某个操作
*/
void doSomething();
/**
* 获取当前状态
*
* @return 状态信息
*/
String getStatus();
}
真实主题:
java
public class RealSubject implements Subject {
/**
* 执行某个操作
*/
@Override
public void doSomething() {
System.out.println("RealSubject: 执行某个操作");
}
/**
* 获取当前状态
*
* @return 状态信息
*/
@Override
public String getStatus() {
System.out.println("RealSubject: 获取当前状态");
return "";
}
}
代理:
java
public class ProxySubject implements Subject {
private final RealSubject realSubject;
public ProxySubject(RealSubject realSubject) {
this.realSubject = realSubject;
}
/**
* 执行某个操作
*/
@Override
public void doSomething() {
System.out.println("ProxySubject: 在执行操作之前做一些准备工作");
realSubject.doSomething();
System.out.println("ProxySubject: 在执行操作之后做一些清理工作");
}
/**
* 获取当前状态
*
* @return 状态信息
*/
@Override
public String getStatus() {
System.out.println("ProxySubject: 获取状态前的处理");
return realSubject.getStatus();
}
}
java
public static void main(String[] args) {
ProxySubject proxySubject = new ProxySubject(new RealSubject());
proxySubject.doSomething();
proxySubject.getStatus();
}