1. 代理模式?静态代理和动态代理?

代理模式:为对象提供一个代理对象,客户端访问代理,代理控制对真实对象的访问(增强、延迟、隔离)。三种:

应用:Spring AOP、MyBatis Mapper 代理、RPC 远程调用(本地接口调远程服务)、日志/监控/权限

🎯 面试要点

  • 代理 vs 装饰器:代理控制"是否调用/何时调用目标"(目标不透明);装饰器增强"调用过程本身"(目标透明,可层层包装)——最常考的对比
  • 代理 vs 适配器:代理保持接口不变;适配器转换接口

2. 装饰器模式?Java 中的经典应用?

装饰器:动态给对象叠加功能,替代继承扩展。结构:装饰器实现同一接口,持有被装饰者引用,调用前后附加逻辑。

Java 经典案例:IO 流全家桶——BufferedInputStream 装饰 FileInputStream(加缓冲),DataInputStream 再加解析能力。层层包装。JDK 源码 BufferedInputStream 构造器接收 InputStream。

装饰器示意
interface Coffee { double cost(); }

class PlainCoffee implements Coffee {
    public double cost() { return 10; }
}

class MilkDecorator implements Coffee {     // 装饰器
    private final Coffee base;
    MilkDecorator(Coffee base) { this.base = base; }
    public double cost() { return base.cost() + 3; }  // 叠加功能
}
// new MilkDecorator(new PlainCoffee()).cost() == 13

🎯 面试要点

  • 继承的替代品:运行时组合优于继承(装饰器模式正是"组合优于继承"的实践)
  • 对比继承:功能组合爆炸问题(咖啡×加料 = 2ⁿ 个类)

3. 适配器模式?应用场景?

适配器:把不兼容的接口转换成客户端期望的接口。两种实现:类适配器(继承)、对象适配器(组合,推荐)。

Java 应用:

🎯 面试要点

  • 适配器 vs 外观:适配器是"接口转换"(一个对象),外观是"子系统统一入口"(一组对象)
  • 适配器 vs 桥接:适配器让"已有"的东西协作;桥接分离"抽象与实现"两个维度(如形状×颜色)

4. 外观模式和享元模式?

🎯 面试要点

  • 享元 ≠ 池化:享元是把大量细粒度对象的可共享部分抽出来共用(如字符、小整数);连接池/线程池是资源复用 + 限流,同一时刻一个资源只服务一个使用者。两者思想同源但不等价,面试被追问时别说成同一个
  • Integer.valueOf() 缓存面试高频:== 比较陷阱(-128~127 命中缓存)

🎤 常见面试追问

  1. 代理模式和装饰器模式的区别?(必考)——代理控制"是否调用/何时调用目标"(目标不透明,如权限/延迟);装饰器增强"调用过程"(目标透明,可层层叠加,如 IO 流包装)。
  2. JDK 动态代理和 CGLIB 怎么选?——目标实现接口 → JDK 代理(生成接口实现类);没接口 → CGLIB(生成子类)。Spring Boot 默认 CGLIB(代理更全)。final 类/方法 CGLIB 也代理不了。
  3. 适配器模式的应用?——InputStreamReader(字节→字符)、Arrays.asList(数组→List)、Spring 的 HandlerAdapter(统一多种 Controller)。
  4. 享元模式的本质?——共享复用对象省内存:内部状态共享(String 常量池、Integer 缓存 -128~127)、外部状态随场景。池化思想(线程池/连接池)都是它。
  5. IO 流为什么要层层包装?——装饰器模式:BufferedInputStream 装饰 FileInputStream 加缓冲,DataInputStream 再加类型解析——组合优于继承,避免"功能 × 类型"类爆炸。

📖 名词解释(本页术语)

术语 大白话解释
代理模式用"代理人"访问目标对象,代理控制访问(增强/延迟/隔离)。AOP、RPC、MyBatis Mapper 都是它。
装饰器模式动态给对象叠加功能(同接口 + 持有被包装者)。Java IO 流全家桶是经典应用。
适配器模式把不兼容的接口转换成客户端期望的接口(电源转换头)。
外观模式(Facade)为复杂子系统提供统一简化入口(一键下单背后多个系统)。JdbcTemplate 就是。
享元模式(Flyweight)共享复用对象省内存:String 常量池、Integer 缓存、线程池/连接池都是享元思想。
桥接模式把"抽象"和"实现"两个维度分离(形状 × 颜色各自独立扩展)。
组合模式树形结构:叶子与容器统一接口递归处理(文件系统、菜单)。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。