代理模式(Proxy Pattern)
定义
适配器模式是一种结构型设计模式,用于解决两个不兼容接口之间的兼容性问题。它通过包装对象的方式,将已有接口转换为客户端期望的接口,类似电源适配器的功能。
UML 类图
核心角色
- Subject:抽象接口,定义真实对象和代理对象的共同行为(如 request())。
- RealSubject:真实对象,实现核心业务逻辑(如数据库查询、文件操作)。
- Proxy:代理对象,控制对 RealSubject 的访问(如权限验证、延迟加载)。
- Client:客户端,通过 Subject 接口调用功能,无需感知代理与真实对象的区别。
优点
- 隔离性:客户端与真实对象解耦,避免直接操作敏感资源(如数据库连接)。
- 功能增强:在不修改真实对象的前提下,添加额外逻辑(如日志记录、性能监控)。
- 性能优化:延迟加载大对象(如图片、视频),减少系统启动时的资源消耗。
- 开闭原则:新增代理类不影响已有代码,符合扩展开放、修改关闭的原则。
缺点
- 复杂度增加:引入代理层可能导致系统结构更复杂(尤其是多重代理)。
- 间接调用开销:代理转发请求可能增加响应时间(远程代理的网络延迟更明显)。
- 代码冗余:静态代理需要为每个类单独编写代理(动态代理可解决此问题)。
适用场景
虚拟代理(延迟加载)
加载大文件或复杂对象时,先用代理占位,按需加载真实对象。
保护代理(权限控制)
控制客户端对敏感资源的访问(如管理员接口、支付功能)。
远程代理(网络通信)
为远程服务(如 REST API、RPC)提供本地代理,隐藏通信细节。
缓存代理(性能优化)
缓存频繁访问的数据(如数据库查询结果、API 响应)。
日志与监控
记录请求日志或统计方法执行时间。
# 代码示例(Java)
静态代理(显式实现代理类)
动态代理(JDK 原生实现)
两种代理类型对比
实际应用案例
Spring AOP
基于动态代理实现事务管理(@Transactional)和日志切面。
Hibernate 延迟加载
使用虚拟代理实现数据库关联对象的按需加载(Lazy Loading)。
RPC 框架(如 Dubbo)
远程代理将本地调用透明转发到远程服务。
安全框架(如 Shiro)
保护代理控制对敏感方法的访问权限。
总结:代理模式通过中间层控制对象访问,是增强系统安全性和灵活性的重要手段。优先选择动态代理(减少代码冗余),在需要精细控制时使用静态代理。