java代理模式通过接口实现,核心是代理类与真实对象实现同一接口,代理类拦截调用并添加访问控制逻辑后再转发。需先定义业务接口,真实对象专注业务逻辑,代理类组合真实对象并插入权限校验等控制。

Java 中用接口实现代理模式控制对象访问,核心是让代理类和真实对象共同实现同一接口,通过代理类拦截调用、添加访问控制逻辑(如权限校验、日志、延迟加载等),再决定是否转发给真实对象。
定义统一接口
先设计一个业务接口,明确需要被代理的操作。这是代理模式的基础——代理类和目标类必须“长得一样”,才能对外透明。
- 接口只声明方法签名,不包含实现
- 所有需受控的方法都放在接口中(比如 read()、write())
- 避免在接口中暴露内部状态或构造细节
实现真实对象(RealSubject)
真实对象实现该接口,专注完成实际业务逻辑,不处理访问控制。
- 例如:一个 FileService 实现 DataAccess 接口,真正读写文件
- 它不知道自己被代理,也不依赖代理类
- 保持高内聚,便于单独测试和复用
编写代理类(Proxy)
代理类也实现同一接口,在方法中插入控制逻辑,再按需调用真实对象。
- 构造时持有真实对象引用(组合优于继承)
- 每个方法开头可做检查:用户是否有权限?资源是否可用?是否超频?
- 示例:if (!currentUser.hasPermission("WRITE")) throw new SecurityException();
- 支持前置处理(如记录调用时间)、后置处理(如关闭连接)、异常处理
动态代理更灵活(可选进阶)
若不想为每个接口手写代理类,可用 java.lang.reflect.Proxy + InvocationHandler 动态生成代理实例。
- 只需一个通用 InvocationHandler 实现访问控制逻辑
- 运行时自动适配任意接口,适合通用场景(如统一鉴权、监控)
- 注意:只能代理接口,不能代理具体类(CGLIB 可补足,但非 JDK 原生)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











