Skip to content

P39 开发中有没有用设计模式,怎么用的 ​

面试题:你在项目里用过哪些设计模式?具体怎么用的?

回答思路 ​

不要说"用过单例、工厂"就结束,要结合自己的项目场景讲:什么业务问题 → 用了什么模式 → 解决了什么。

高频且好讲的几个 ​

1. 策略模式(最推荐讲) ​

场景:支付渠道(微信/支付宝/银联)、优惠券计算、活动类型、第三方短信/文件上传。

java
public interface PayStrategy {
    void pay(Order order);
}

// 微信支付、支付宝支付各自实现
// Map<String, PayStrategy> 按渠道注入,去掉 if-else

好处:新增渠道不用改原逻辑(开闭原则)、代码清晰。

2. 模板方法模式 ​

场景:下单流程固定步骤(校验 → 扣库存 → 生成订单 → 发通知),但不同业务步骤实现不同;用抽象类定义骨架,子类覆写。

3. 单例模式 ​

场景:配置中心客户端、线程池、工具类。注意:Spring 的 Bean 默认就是单例,要讲"容器单例"和"自己手写单例(饿汉/懒汉/DCL)"的区别。

4. 工厂模式 ​

场景:根据类型创建不同对象(如消息处理器、解析器),简单工厂/工厂方法/抽象工厂。

5. 观察者模式(发布订阅) ​

场景:订单状态变更后通知库存、积分、短信多个模块,用 Spring 事件(ApplicationEventPublisher + @EventListener)解耦。

6. 责任链模式 ​

场景:审批流、过滤器(参数校验 → 鉴权 → 风控)、网关过滤器链。

7. 代理模式 ​

场景:AOP(事务、日志、权限)本质就是动态代理;讲 Spring AOP 用 JDK 动态代理/CGLIB。

8. 建造者模式 ​

场景:构造参数很多的 DTO/请求对象(Lombok @Builder)。

回答模板(面试示范) ​

text
"我在做支付模块时用过策略模式:原来根据渠道写了一大堆 if-else,
后来定义 PayStrategy 接口,微信/支付宝/银联各自实现,
用 Spring 注入成 Map<渠道, 策略>,新增渠道只需要加一个实现类,
主流程完全不用改,也方便单测。"

加分点 ​

  • 说出设计模式的目的(解耦、复用、扩展、可维护),而不是背定义;
  • 主动提"过度设计":简单场景不要硬套模式;
  • 提源码中的应用:Spring 的 BeanFactory(工厂)、AOP(代理)、事件(观察者)、MyBatis 的 Executor(模板/装饰)。

一句话总结 ​

挑 2~3 个真实用过的模式(策略、模板方法、观察者、责任链最常考),按"业务场景 + 模式结构 + 解决了什么"的结构讲,能体现设计能力和落地经验。

基于 VitePress 重建