代理设计模式
- 🚩什么是代理设计模式?
- 🚩代理设计模式的特点
- 🚩代理设计模式的结构
- 🚩代理设计模式的优缺点
- 🚩代理设计模式的Java实现
- 🚩代码总结
- 🚩总结
🚩什么是代理设计模式?
代理设计模式(Proxy Pattern) 是一种 结构型设计模式,它为其他对象提供一种 代理 以控制对这个对象的访问。代理模式通过创建一个代理对象,在客户端和目标对象之间起到 中介作用,可以在不改变原始类代码的情况下增加额外的功能。
使用场景
-
当需要 控制对对象的访问 时(如权限控制、延迟加载等)
-
当需要 为对象提供额外功能 时(如日志记录、性能监控等)
-
当需要 远程访问对象 时(如RPC调用)
🚩代理设计模式的特点
-
中介作用:代理对象在客户端和目标对象之间起中介作用
-
透明性:客户端无需知道使用的是代理还是真实对象
-
功能扩展:可以在不修改目标对象的情况下增加额外功能
-
访问控制:可以控制客户端对目标对象的访问
🚩代理设计模式的结构
代理模式主要包含以下部分:
-
Subject(抽象主题):定义真实主题和代理主题的共同接口
-
RealSubject(真实主题):实现真正的业务逻辑
-
Proxy(代理):持有真实主题的引用,控制对真实主题的访问
-
Client(客户端):通过代理对象间接访问真实主题
图例:
🚩代理设计模式的优缺点
✅ 优点
-
职责清晰:真实主题只需关注核心业务逻辑
-
高扩展性:可以在不修改目标对象的情况下增加功能
-
智能化:代理可以实现延迟加载、访问控制等智能功能
❌ 缺点
-
增加系统复杂度:引入了额外的代理层
-
性能开销:代理调用会带来额外的处理时间
-
可能违反开闭原则:某些代理实现可能需要修改代理类
🚩代理设计模式的Java实现
代码地址: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 {@Overridepublic 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;}@Overridepublic 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()
返回的同步集合代理
-
创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️