第4篇:模板方法 vs 策略模式,面试怎么选?

第4篇:模板方法 vs 策略模式,面试怎么选?

摘要:​模板方法和策略模式都是行为型设计模式,但一个用继承、一个用组合,一个控制骨架、一个封装算法。本文用对比表格和实际场景帮你彻底分清两者的区别,并附上面试常问的陷阱问题,让你不再混淆。

本文是《Java 23 种设计模式:从踩坑到精通》模板方法模式长文的扩充短文第4篇,帮助你碎片化掌握核心知识点。

前一篇我们手写了饮品制作模板,用继承实现了固定骨架 + 可变细节。但面试官经常会追问:"模板方法模式和策略模式有什么区别?什么时候该用哪个?"

这两个模式都是行为型,都用来处理算法变化,但设计思路截然不同。搞混了,项目代码可能越写越别扭。


一张表看懂区别

对比维度 模板方法模式 策略模式
定义方式​ 继承:子类重写父类方法 组合:接口实现,客户端注入
控制权​ 父类控制整体流程,子类只填充细节 客户端选择策略,策略控制算法
粒度​ 控制算法的骨架(部分步骤可变) 封装整个算法(整体可替换)
复用方式​ 复用父类的通用代码 复用策略接口和具体策略类
典型应用​ HttpServlet、JdbcTemplate、AbstractList Comparator、支付方式、折扣策略
扩展方式​ 新增子类 新增策略实现类

一句话记忆口诀

流程固定、只需修改部分步骤 → 模板方法​

需要整体替换算法、动态切换 → 策略模式

举个例子帮你分清

场景一:数据同步工具​

同步流程固定:连接 → 提取 → 转换 → 加载 → 断开。不同数据源(MySQL、Oracle、Redis)只在提取和加载步骤不同。

→ 用模板方法 ,父类定流程,子类实现 extractData()和 loadData()。

场景二:电商促销计算​

同一商品在不同促销活动下,折扣计算方式完全不同:满减、打折、赠品。而且活动可能随时切换。

→ 用策略模式 ,定义 DiscountStrategy接口,客户端运行时选择具体策略。

面试官追问陷阱

"既然模板方法用继承,策略用组合,那是不是策略一定优于模板?"

不一定。模板方法的优势在于流程一致性------父类牢牢把控顺序,子类不可能打乱步骤。这在很多框架中是刚需(比如 HttpServlet 的请求处理流程)。策略模式虽然更灵活,但如果流程顺序本身也是业务约束,用策略反而容易失控。


一句话总结:继承复用用模板,组合复用用策略。


📖 完整长文入口:本文是模板方法模式扩充系列的第4篇。如果你想一次性阅读完整内容(含UML、完整代码、框架应用、面试追问等),请查看原长文:

👉 《Java 23 种设计模式:从踩坑到精通 | 模板方法模式》

🔗 系列导航:

相关推荐
Bazingga5 小时前
Java16 record 完整拆解——语法、语义、限制、反射
java·后端
SL_staff7 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
骑着蜗牛撵大象3277 小时前
Linux 进程间通信之管道:从 pipe() 的内核语义到 FIFO 落地排错
android·java·linux·系统编程·fifo·管道·进程间通信
WJ.Polar7 小时前
Java封装、继承、多态
java·开发语言
ly76897 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
摇滚侠7 小时前
Java 中如何表示负数,有符号和无符号的区别,补码的计算规则,char byte short int long 的范围
java·开发语言
高晶8 小时前
CANopen 在 BMS 系统中的 C 语言实战指南
设计模式·程序员
奇牙coding8 小时前
Codex CLI 升级后多文件编辑静默失效:config.yaml 枚举变更排查与修复指南
java·前端·javascript·ai
小羊没烦恼!8 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
Lhappy嘻嘻8 小时前
读懂 JVM:内存模型、类加载机制、分代回收
java·开发语言·jvm