模板方法模式:为什么你的代码重复率这么高?模板方法模式了解一下
作者:互联网
2026-03-24
假设现在你正在开发一个数据导出功能。 支持导出 CSV 和 Excel。
CSV 导出的逻辑:
- 连接数据库
- 查询数据
- 把数据转成逗号分隔字符串 (差异点)
- 生成文件并下载
- 记录日志
Excel 导出的逻辑:
- 连接数据库
- 查询数据
- 把数据转成二进制 Excel 格式 (差异点)
- 生成文件并下载
- 记录日志
除了第 3 步不一样,其他 4 步完全一样。 如果你写了两个类 ExportCsv 和 ExportExcel,并且把相同代码复制了两遍,那就是**重复代码 (Duplication)**。 如果以后要改“连接数据库”的逻辑,你得改两个地方。
模板方法模式 (Template Method Pattern) 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现。 简而言之:爸爸定规矩,儿子填细节。

一、PHP 8.1+ 实战演示
1. 抽象基类 (Abstract Class)
定义算法的骨架。
2. 具体子类 (Concrete Class)
只实现差异化的部分。
3. 客户端调用
客户端只管调用 export(),不需要知道内部的步骤。
二、90% 程序员不知道的细节
“好莱坞原则” (Hollywood Principle):Don't call us, we'll call you.
在模板方法模式中,是父类调用子类的方法($this->formatData()),而不是子类调用父类。 这与通常的继承(子类调用 parent::method())是反过来的。 这种控制反转 (IoC) 是框架设计的核心。比如 PHPUnit,你只需要写 testXXX(),PHPUnit 框架会自动去调用它,而不需要你写 main() 函数来手动调用。
三、、什么时候用?(场景)
一次性实现一个算法的不变部分,并将可变的行为留给子类来实现。
各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。
控制子类扩展:模板方法只在特定点调用“钩子”操作,这样就只允许在这些点进行扩展。
四、总结
模板方法模式 (Template Method Pattern):
- 一句话:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
- 核心价值:代码复用和流程控制。确保所有子类都遵循相同的处理流程,同时允许它们定制特定的步骤。
延伸思考:如果步骤非常多(比如 20 个),而且不同的子类只需要实现其中的 2-3 个,其他的都想用默认实现。这时候该怎么设计?(提示:大量使用钩子方法,父类提供默认的空实现或通用实现,子类按需覆盖。)
相关标签:
相关推荐
专题
+ 收藏
+ 收藏
+ 收藏
+ 收藏
+ 收藏
最新数据
相关文章
NanoClaw 开源轻量级个人AI助手 安全可靠的OpenClaw替代方案
MonsterClaw 采用 OpenClaw 技术打造的本地化AI运行平台
TinyClaw 由TinyAGI推出的开源轻量级多智能体协作框架
携程酒店业务借助NebulaGraph实现月均风控止损逾百万元
稀宇科技开源MiniMax Office Skills生产级办公文档引擎
ToClaw由ToDesk打造的专业定制AI智能体
TypeNo 免费开源的中文AI语音输入法 无需配置直接使用
Sub2API 开源人工智能API中转网关平台 具备多账户管理功能
阿里通义推出视频生成音频框架PrismAudio
Luma AI发布Uni-1模型实现图像理解与生成一体化
AI精选
