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