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

面试

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

这个模式在业务开发中太常见了。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");
    }
}
相关推荐
吴声子夜歌1 小时前
Java面试——Spark原理及应用(二)
java·面试·spark
吴声子夜歌2 小时前
Java面试——Spark原理及应用(一)
java·面试·spark
慧一居士2 小时前
ThreadLocal 功能及使用场景介绍,使用详解
java
zh73143 小时前
typephp的编译核心phpx原理解析
android·java·开发语言
2401_894915535 小时前
GEO 优化源码全解析:从搜索引擎到 AI 引擎的底层改写逻辑
java·服务器·前端·数据库·人工智能·分布式·搜索引擎
Java牛马9 小时前
SpringBoot Starter 依赖相关总结
java·spring·springboot·starter·自动装配·依赖
吴声子夜歌9 小时前
Java面试——Spring Cloud原理及应用(二)
java·spring cloud·面试
东小西10 小时前
【SAA实战】第 1 篇:ReactAgent 入门——先撸个"会调工具的助手"跑起来
java·人工智能·spring
xrandzj10 小时前
MySQL8.0 从零通关核心操作手册(Ubuntu实战版)
数据库·mysql
我不会插花弄玉10 小时前
4.数据类型【由浅入深-MySQL】
数据库·mysql