什么是代理模式?一般用在什么场景?

面试

代理模式是一种结构型设计模式,核心思想是在不改变原始对象的前提下,通过一个代理对象来控制对原始对象的访问,可以在调用前后加点料,比如权限校验、日志记录、缓存等。

这个模式在业务开发中太常见了。Spring AOP 就是基于动态代理实现的,你写的 @Transactional、@Async、@Cacheable 这些注解能生效,底层都是代理在干活。RPC 框架也是靠动态代理,让调用远程方法跟调本地方法一样丝滑,Dubbo、gRPC 都是这个套路。

代理模式的结构很简单:客户端不直接调真实对象,而是调代理对象,代理对象内部持有真实对象的引用,在调用真实对象方法前后可以插入额外逻辑。

代理模式主要用在这几个场景:

  1. 访问控制:调方法前先检查权限,没权限直接拦住
  2. 延迟加载:真实对象创建成本高,用代理先顶着,真正用到时才初始化
  3. 远程代理:把网络通信细节封装在代理里,客户端以为在调本地方法
  4. 日志监控:统一在代理层记录方法调用耗时、参数、异常,不用每个方法都加代码
java 复制代码
// 接口
interface UserService {
    void save(User user);
}

// 真实对象
class UserServiceImpl implements UserService {
    public void save(User user) {
        System.out.println("保存用户: " + user.getName());
    }
}

// 代理对象:加了日志和耗时统计
class UserServiceProxy implements UserService {
    private UserService target;

    public UserServiceProxy(UserService target) {
        this.target = target;
    }

    public void save(User user) {
        long start = System.currentTimeMillis();
        System.out.println("开始调用 save 方法");
        target.save(user);  // 调真实对象
        System.out.println("调用结束,耗时: " + (System.currentTimeMillis() - start) + "ms");
    }
}
相关推荐
码流子28 分钟前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质43 分钟前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
云创智城-yuncitys1 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
文丑颜不良啊1 小时前
LeetCode1661~1680题目解析
java·leetcode
子非鱼@Itfuture1 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李1 小时前
openFeign入门
java·开发语言·前端
wljt1 小时前
公司二-面试题
java·开发语言·mybatis
AI备案指南-满满2 小时前
算法备案审核不通过,一般是什么原因?
java·人工智能·算法·大模型备案·算法备案·大模型登记
秋天的怀念_David2 小时前
算法一千零一夜 · 第二十三夜 电力民生写成的曲线
java·程序人生·算法
吴名氏.2 小时前
Java转AI Agent教程(第五周)Prompt工程
java·人工智能·prompt·ai agent