1. 代理模式的核心价值与应用场景
代理模式是面向对象设计中一个非常实用的结构型模式。它的核心思想很简单:通过引入一个代理对象来控制对原始对象的访问。这种控制可以体现在访问权限、性能优化、功能增强等多个方面。
我在实际项目中第一次使用代理模式是在开发一个电商平台的商品详情模块时。当时需要在不修改原有商品服务代码的情况下,为商品查询接口添加缓存功能。直接修改商品服务代码风险太大,而代理模式完美解决了这个问题 - 我们创建了一个商品服务代理类,在调用真实商品服务前先检查缓存,命中缓存则直接返回,未命中再调用真实服务并写入缓存。
这种"中间层"的设计带来了几个显著优势:
- 符合开闭原则:无需修改原有代码就能扩展功能
- 职责清晰:代理类专注于控制访问,真实对象专注于核心逻辑
- 灵活性高:可以随时替换或叠加不同的代理
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 代理模式的三种实现方式
2.1 静态代理:编译时确定的代理关系
静态代理是最基础的形式,代理类和被代理类在编译期就已经确定。下面是一个典型的静态代理实现:
java复制// 接口
public interface UserService {
void addUser(String name);
}
// 真实对象
public class UserServiceImpl implements UserService {
public void addUser(String name) {
System.out.println("添加用户:" + name);
}
}
// 代理类
public class UserServiceProxy implements UserService {
private UserService target;
public UserServiceProxy(UserService target) {
this.target = target;
}
public void addUser(String name) {
System.out.println("开始事务...");
target.addUser(name); // 调用真实对象的方法
System.out.println("提交事务...");
}
}
使用时的代码:
java复制UserService service = new UserServiceProxy(new UserServiceImpl());
service.addUser("张三");
静态代理的优点是简单直接,但缺点也很明显:每个真实类都需要创建一个代理类,当接口方法很多时,代理类会变得臃肿。
2.2 动态代理:运行时生成的代理对象
动态代理通过反射机制在运行时动态创建代理类。Java中常用的实现方式有两种:
