文章目录一、代理模式定义二、代理模式的结构和说明三、代理模式的分类四、代理模式示例五、动态代理1、JDK动态代理JDK动态代理使用步骤JDK动态代理示例JDK动态代理实现原理JDK动态代理局限性2、CGLIB动态代理CGLIB动态代理使用步骤CGLIB动态代理示例CGLIB动态代理实现原理CGLIB动态代理注意事项六、三种代理方式的对比七、代理模式的应用场景及案例 一、代理模式定义 Provide a surrogate or placeholder for another object to control access to it. 为其它对象提供一种代理以控制对这个对象的访问。 代理 【代理模式】是一种常用的设计模式,它允许我们创建一个代表原始对象的代理对象,通过代理对象来间接调用真实对象的方法。代理模式的核心思想是控制对真实对象的访问,为客户提供一个替代品,以增强或扩展原有功能,同时保持与真实对象相同的接口。 **一、代理模式定义** 代理模式的主要目的是为了在调用实际对象之前添加额外的功能或控制。代理对象持有真实对象的引用,并在客户端与真实对象之间起到中介作用。这可以用于权限控制、性能优化、日志记录等多种场景。 **二、代理模式结构** 代理模式通常有两种实现方式:聚合和继承。聚合方式下,代理对象和真实对象都实现相同的接口,代理对象内部持有真实对象的实例。继承方式下,代理对象直接继承自真实对象,但这种方式的灵活性较低,因为一个代理类只能对应一个真实类。 **1. 聚合方式** - **Subject(目标接口)**:定义了客户端与真实对象交互的接口。 - **RealSubject(具体目标对象)**:实现了Subject接口的实际业务逻辑对象。 - **Proxy(代理对象)**:实现了Subject接口,持有RealSubject的引用,负责在调用RealSubject前/后执行额外操作。 **三、代理模式分类** 1. **虚拟代理**:延迟加载大型资源,如图片、视频等,只在真正需要时才加载。 2. **保护代理**:根据用户权限决定是否允许访问真实对象。 3. **远程代理**:为远程对象提供本地接口,如Java的RMI技术。 4. **缓冲代理**:缓存对象结果,减少重复计算。 5. **智能引用代理**:在对象被引用时提供额外操作,如统计使用次数。 6. **Copy on Write代理**:只有对象改变时才复制,提高效率。 7. **防火墙代理**:阻止非法访问,保护系统安全。 8. **同步代理**:确保多线程环境下的对象访问安全。 **四、代理模式示例** 一个简单的保护代理示例是订单系统。订单创建后,只有创建者可以修改订单数量。通过代理模式,我们可以创建一个OrderApi接口,由Order类实现该接口。代理类OrderProxy同样实现OrderApi接口,检查用户是否有权修改订单。 ```java public interface OrderApi { void changeOrderNum(int orderNum, String user); } public class Order implements OrderApi { private String productName; private int orderNum; private String orderUser; // ...构造方法、getter、setter public void changeOrderNum(int orderNum, String user) { if (user.equals(this.orderUser)) { this.orderNum = orderNum; } else { throw new IllegalArgumentException("无权限修改"); } } } public class OrderProxy implements OrderApi { private OrderApi realOrder; public OrderProxy(OrderApi realOrder) { this.realOrder = realOrder; } @Override public void changeOrderNum(int orderNum, String user) { // 额外的检查或操作 checkPermission(user); realOrder.changeOrderNum(orderNum, user); } private void checkPermission(String user) { // 检查用户权限... } } ``` **五、动态代理** 1. **JDK动态代理**:通过`java.lang.reflect.Proxy`和`java.lang.reflect.InvocationHandler`实现,适用于接口代理。创建代理类无需预先编写代码,而是运行时动态生成。 2. **CGLIB动态代理**:基于ASM库,可以在运行时动态生成子类,适用于无接口或接口不足的情况。CGLIB是Spring框架默认的动态代理实现。 **六、代理方式对比** JDK动态代理限制于接口,而CGLIB基于字节码生成子类,可以代理非接口类,但可能比JDK代理慢。选择哪种代理取决于具体需求。 **七、应用场景** - 权限控制:如订单系统中的例子。 - 日志记录:在方法调用前后记录操作信息。 - 性能优化:如缓存机制,避免重复计算。 - 异步处理:通过代理对象启动异步任务,不影响主线程。 - 事务管理:代理对象负责开启、提交或回滚事务。 代理模式是软件设计中的一种重要模式,它提供了灵活的方式来控制对象的访问,增加新的功能,同时保持代码的简洁和模块化。在实际开发中,正确地运用代理模式可以提高系统的可扩展性和可维护性。
剩余8页未读,继续阅读
- 粉丝: 7
- 资源: 904
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助