← 每日面试题 学习看板

使用哪种设计模式可以提高代码可维护性?

面试题/02架构设计题/09设计模式/使用哪种设计模式可以提高代码可维护性?.md

面试记录 2026-09-28

题目:使用哪种设计模式可以提高代码可维护性?

难度:difficulty/high

标签:arch/design-pattern, architecture/design, general/knowledge, difficulty/high

评分:⭐⭐⭐⭐☆(4/5)

我的回答

首先就是 Spring 中最核心的代理模式,通过代理对象对,在方法不改动的情况下对方法实行扩展,提高了代码的可维护性。

其次是我觉得是策略模式,策略模式中通过对于策略的扩展,然后提升整个代码的扩展能力,而不是每次去 if else 的去进行修改,这也是我用的比较多的一种模式。

再有就是创建者或者说工厂一类的,它把创建的创建对象简化了,提供了更简洁的能力,也更利于抽象化。

还有责任链模式。在一些判定的过程中,我会使用责任链模式,比较方便的扩展判定规则,更容易进行减少方法的变更,更容易进行修改,更容易进行扩展。

点评

优点:

不足:

补充(可维护性模式的完整分类):

类别模式可维护性收益
减少变更策略模式加新策略不改老代码(OCP)
代理模式AOP 横切逻辑从业务代码剥离
观察者模式事件解耦,新增监听不动发送端
消除重复模板方法提取算法骨架,子类只实现差异
简化调用工厂模式封装复杂创建过程
建造者模式复杂对象分步构建,可读性高
外观模式收敛复杂子系统为几个 API
规则可插拔责任链模式新增规则节点即可,不改主流程
动态增强装饰器模式运行时组合功能,不用继承爆炸

完整讲解

第一部分:知识重点剖析

核心考点定位:考察对设计模式实际工程价值的理解,特别是"可维护性"这一设计目标的落地方式。

知识点拆解:

  1. 可维护性的本质:降低变更成本—— 每次需求变化时,改动的代码越少、影响范围越小、回归成本越低,可维护性就越高。
  1. 减少变更范围的模式(OCP 落地):
  1. 消除重复代码的模式(DRY 原则):
  1. 简化调用点的模式(KISS 原则):
  1. 动态增强的模式:
  1. 回答框架(senior 加分项):
  1. 反过度设计的标志:

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. 策略模式和 if-else 的分界线在哪?什么情况该抽象成策略?
  1. 观察者模式在 Spring 中如何落地?如何避免"事件风暴"?
  1. 责任链模式和策略模式有什么区别?什么场景选哪个?

第三部分:面试者参考回答(300-600 字口语化)

面试官您好,可维护性的核心是降低变更成本——每次需求变化时,改动的代码越少、影响范围越小、回归成本越低,可维护性就越高。我从三个维度选模式:

第一维度是减少变更范围,对应开闭原则 OCP。最常用的是策略模式,业务分支多的场景(不同支付方式、不同通知渠道、不同优惠计算规则)特别适合——加新策略不改老代码,比 if-else 好维护太多。其次代理模式(Spring AOP 核心)把横切关注点(日志、事务、权限、限流)从业务代码剥离,业务代码保持纯粹。第三个是观察者模式,Spring 里用 ApplicationEvent + @EventListener,跨模块协作(订单支付完成后触发积分、通知、库存回滚)用事件驱动,新增监听器完全不动发送端,这是解耦利器。

第二维度是消除重复代码,对应 DRY 原则。模板方法把"参数校验 → 业务执行 → 后置日志"这种重复骨架抽成模板,子类只实现差异部分,Spring 的 JdbcTemplate、RestTemplate 都是典型。工厂模式和建造者模式把复杂对象创建收敛,比到处 new + 初始化好读太多。

第三维度是简化调用点,对应 KISS 原则。外观模式把复杂子系统收敛为几个 API(如 RestTemplate 收敛了 HttpURLConnection 的复杂操作)。责任链模式特别适合规则判定场景(参数校验链、权限校验链、风控规则链、支付回调链),加新规则节点即可,不改主流程,这是我认为最容易落地的可维护性模式。

装饰器模式是动态增强,运行时组合功能不用继承爆炸,IO 流、代理增强都是典型。

实际项目里用得最多的三个:策略模式(业务分支多、if-else 泛滥时)、观察者模式(跨模块协作、需要解耦时)、责任链模式(判定规则、校验链、回调处理)。

但克制使用很重要——简单业务不要为了用模式而用模式,一行 if-else 比抽象策略类更易读。判断标准:如果一年内这个分支大概率要改 3 次以上,才值得抽象成模式。反过度设计的标志:简单 CRUD 强用策略模式、只有两个实现也上策略接口、大量工厂+策略+建造者堆叠形成"过度抽象",这些都会让代码更难维护。