设计模式实战:模板方法模式(Template Method)

在开发中,你是否写过这样的代码:

python 复制代码
def process():
    step1()
    step2()
    step3()

然后在另一个地方:

python 复制代码
def process_v2():
    step1()
    step2_new()
    step3()

再后来:

python 复制代码
def process_v3():
    step1()
    step2_new()
    step3_new()

你会发现:

  • 整体流程是固定的
  • 只有某些步骤会变化
  • 代码开始出现大量重复

这正是 模板方法模式(Template Method) 要解决的问题。


一、模板方法模式解决什么问题?

一句话:

定义一个算法的骨架,将某些步骤延迟到子类中实现。

关键词:

  • 固定流程
  • 可变步骤
  • 代码复用
  • 控制流程

二、一个典型场景:数据处理流程

假设我们要实现一个"数据处理流程":

步骤如下:

1️⃣ 读取数据

2️⃣ 数据处理

3️⃣ 输出结果

不同场景:

  • CSV 文件处理
  • JSON 数据处理
  • 数据库数据处理

如果直接写:

python 复制代码
def process_csv():
    read_csv()
    handle_csv()
    output()

def process_json():
    read_json()
    handle_json()
    output()

问题:

  • 流程重复
  • 难维护
  • 修改流程需要改多处

三、模板方法模式的核心思想

把"流程骨架"固定在父类中,把"可变步骤"交给子类。

结构:

id="mwv8nu" 复制代码
AbstractClass
     |
ConcreteClass

关键点:

  • 父类定义流程(模板方法)
  • 子类实现具体步骤

四、Python 实现模板方法模式

1️⃣ 定义抽象类

python 复制代码
from abc import ABC, abstractmethod

class DataProcessor(ABC):

    def process(self):
        self.read()
        self.handle()
        self.output()

    @abstractmethod
    def read(self):
        pass

    @abstractmethod
    def handle(self):
        pass

    def output(self):
        print("输出结果")

说明:

  • process() 是模板方法(固定流程)
  • read/handle 是可变步骤
  • output 是默认实现

2️⃣ 具体实现类

python 复制代码
class CSVProcessor(DataProcessor):

    def read(self):
        print("读取 CSV")

    def handle(self):
        print("处理 CSV 数据")
python 复制代码
class JSONProcessor(DataProcessor):

    def read(self):
        print("读取 JSON")

    def handle(self):
        print("处理 JSON 数据")

3️⃣ 使用方式

python 复制代码
processor = CSVProcessor()
processor.process()

输出:

复制代码
读取 CSV
处理 CSV 数据
输出结果

五、模板方法模式的核心价值

模板方法模式本质是:

把流程固定,把变化隔离。

它解决的是:

  • 重复代码
  • 流程一致但实现不同
  • 控制执行顺序

六、钩子方法(Hook)

模板方法中常见一个扩展点 ------ Hook(钩子方法)。

python 复制代码
class DataProcessor(ABC):

    def process(self):
        self.read()
        self.handle()

        if self.need_output():
            self.output()

    def need_output(self):
        return True

子类可以选择覆盖:

python 复制代码
class SilentProcessor(DataProcessor):

    def read(self):
        print("读取数据")

    def handle(self):
        print("处理数据")

    def need_output(self):
        return False

作用:

  • 提供可选扩展点
  • 控制流程分支

七、模板方法 vs 策略模式

很多人会混淆。

区别很关键:

对比点 模板方法 策略模式
实现方式 继承 组合
控制流程 父类控制 客户端控制
是否可动态切换 否 是

一句话总结:

模板方法是"流程写死,步骤可变",

策略模式是"步骤可替换"。


八、Python 中的"轻量实现"

Python 中有时候不需要严格用抽象类。

也可以用"约定"实现:

python 复制代码
class BaseProcessor:

    def process(self):
        self.read()
        self.handle()
        self.output()

    def output(self):
        print("输出")

子类只要实现:

python 复制代码
class MyProcessor(BaseProcessor):

    def read(self):
        ...

    def handle(self):
        ...

这就是 Python 的灵活性。


九、真实项目中的应用

模板方法模式非常常见:

1️⃣ Web 框架

Django / Flask 请求流程:

id="f8yv54" 复制代码
请求 → 中间件 → 视图 → 响应

流程固定,细节可扩展。


2️⃣ 爬虫框架

id="gsz9p3" 复制代码
请求 → 解析 → 存储

不同网站实现不同解析逻辑。


3️⃣ 数据处理管道

ETL 流程:

id="3d5c6q" 复制代码
Extract → Transform → Load

4️⃣ 测试框架

id="7kq6o1" 复制代码
setup → test → teardown

十、优缺点

✅ 优点

  • 提高代码复用
  • 固定流程,降低出错概率
  • 符合开闭原则

❌ 缺点

  • 依赖继承
  • 灵活性不如策略模式
  • 子类过多时复杂

十一、什么时候使用模板方法?

适合:

  • 流程固定
  • 步骤可变
  • 多个类似算法

不适合:

  • 需要动态切换逻辑
  • 流程变化频繁

十二、一句话总结

模板方法模式的本质是:
固定流程,开放步骤。

换句话说:

把"骨架"写在父类,把"细节"交给子类。


相关推荐
海绵宝宝转agent3 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭3 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT3 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
2601_962071574 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境5 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
Java后端的Ai之路5 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数
计算机毕业编程指导师5 小时前
计算机毕设选题推荐:基于Hadoop与Spark的Steam游戏数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·steam游戏
计算机毕业编程指导师5 小时前
【计算机毕设选题推荐】基于Hadoop+Spark的白鹿抖音评论大数据分析与可视化系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·hadoop·python·计算机·spark·毕业设计·抖音评论
Zootopia6265 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
Y3815326625 小时前
搜索 API 延迟优化:并发数、超时与超时的真实代价
python·搜索引擎