代理设计模式(Proxy Pattern) 是一种 结构型设计模式,它为其他对象提供一种 代理 以控制对这个对象的访问。代理模式通过创建一个代理对象,在客户端和目标对象之间起到 中介作用,可以在不改变原始类代码的情况下增加额外的功能。
使用场景
当需要 控制对对象的访问 时(如权限控制、延迟加载等)
当需要 为对象提供额外功能 时(如日志记录、性能监控等)
当需要 远程访问对象 时(如RPC调用)
中介作用:代理对象在客户端和目标对象之间起中介作用
透明性:客户端无需知道使用的是代理还是真实对象
功能扩展:可以在不修改目标对象的情况下增加额外功能
访问控制:可以控制客户端对目标对象的访问
代理模式主要包含以下部分:
Subject(抽象主题):定义真实主题和代理主题的共同接口
RealSubject(真实主题):实现真正的业务逻辑
Proxy(代理):持有真实主题的引用,控制对真实主题的访问
Client(客户端):通过代理对象间接访问真实主题
✅ 优点
职责清晰:真实主题只需关注核心业务逻辑
高扩展性:可以在不修改目标对象的情况下增加功能
智能化:代理可以实现延迟加载、访问控制等智能功能
❌ 缺点
增加系统复杂度:引入了额外的代理层
性能开销:代理调用会带来额外的处理时间
可能违反开闭原则:某些代理实现可能需要修改代理类
代码地址:GitHub
抽象主题 Subject
接口/**
* @author hanson.huang
* @version V1.0
* @InterfaceName Subject
* @Description 抽象主题 Subject
* @date 2025/3/24 19:16
**/
public interface Subject {
public void buy();
}
真实主题 RealSubject
/**
* @author hanson.huang
* @version V1.0
* @ClassName RealSubject
* @Description 真实主题 RealSubject
* @date 2025/3/24 19:17
**/
public class RealSubject implements Subject {
@Override
public void buy() {
System.out.println("付钱");
}
}
代理 Proxy
/**
* @author hanson.huang
* @version V1.0
* @ClassName Proxy
* @Description 代理 Proxy
* @date 2025/3/24 19:17
**/
public class Proxy implements Subject {
protected RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void buy() {
System.out.println("办理购买前的手续");
realSubject.buy();
System.out.println("办理购买后的手续");
}
}
/**
* @author hanson.huang
* @version V1.0
* @ClassName ProxyPattern
* @Description 测试代理模式
* @date 2025/3/24 19:08
**/
public class ProxyPattern {
public static void main(String[] args) {
RealSubject realSubject = new RealSubject();
Proxy proxy = new Proxy(realSubject);
proxy.buy();
}
}
运行结果
抽象主题 Subject 定义了真实主题和代理的共同接口
真实主题 RealSubject 实现了核心业务逻辑
代理 Proxy 控制对真实主题的访问并添加额外功能
客户端 通过代理对象间接访问真实主题
代理设计模式 通过引入代理对象控制对目标对象的访问
核心是 在不改变原始类的情况下增加额外功能
适用于 访问控制、功能增强、远程调用 等场景
✅ Java源码中的应用场景:
Java动态代理:
java.lang.reflect.Proxy
类
广泛应用于Spring AOP中
RMI远程调用:
java.rmi.*
包中的远程对象代理MyBatis:
Mapper接口的代理实现
org.apache.ibatis.binding.MapperProxy
Spring框架:
事务管理的代理实现
安全控制的代理实现
Hibernate:
延迟加载使用代理实现
org.hibernate.proxy.ProxyFactory
Java标准库:
Collections.unmodifiableList()
返回的不可修改集合代理
Collections.synchronizedList()
返回的同步集合代理
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️