模板方法模式的核心思想是定义一个操作中的算法骨架,将部分步骤延迟到子类中实现,使得子类可以不改变算法整体结构的情况下重新定义某些特定步骤,在Python中可以通过类的继承和方法重写轻松实现该模式。

模板方法模式的核心结构
模板方法模式主要包含两个部分:
- 抽象类:定义模板方法和抽象步骤方法,模板方法规定了整体执行流程,抽象步骤方法由子类实现
- 具体子类:继承抽象类,实现其中的抽象步骤方法,完成特定场景下的逻辑
Python实现模板方法模式示例
以数据处理流程为例,整体流程是固定的:读取数据、处理数据、保存数据,其中读取和保存的逻辑在不同场景下可能有差异,我们可以用模板方法模式实现:
from abc import ABC, abstractmethod
# 抽象类,定义模板方法
class DataProcessor(ABC):
# 模板方法,定义整体流程,不允许子类重写
def process(self):
self.read_data()
self.handle_data()
self.save_data()
# 抽象方法,读取数据,由子类实现
@abstractmethod
def read_data(self):
pass
# 通用处理方法,子类可重写也可使用默认实现
def handle_data(self):
print("执行默认的数据处理逻辑")
# 抽象方法,保存数据,由子类实现
@abstractmethod
def save_data(self):
pass
# 具体子类1:处理CSV数据
class CsvDataProcessor(DataProcessor):
def read_data(self):
print("从CSV文件中读取数据")
def save_data(self):
print("将处理后的数据保存到CSV文件")
# 具体子类2:处理数据库数据
class DbDataProcessor(DataProcessor):
def read_data(self):
print("从数据库中读取数据")
def handle_data(self):
print("执行数据库数据的特殊处理逻辑")
def save_data(self):
print("将处理后的数据保存到数据库")
# 测试代码
if __name__ == "__main__":
print("CSV数据处理流程:")
csv_processor = CsvDataProcessor()
csv_processor.process()
print("n数据库数据处理流程:")
db_processor = DbDataProcessor()
db_processor.process()
上述代码中,DataProcessor是抽象类,process是模板方法,固定了数据处理的三个步骤顺序。CsvDataProcessor和DbDataProcessor作为具体子类,分别实现了不同场景下的数据读取和保存逻辑,也可以根据需求重写通用的handle_data方法。
模板方法模式在框架设计中的应用
模板方法模式在各类框架设计中非常常见,典型应用场景包括:
- Web框架的请求处理流程:比如很多Python Web框架会定义请求处理的模板方法,包含请求解析、路由匹配、视图执行、响应生成等固定步骤,开发者只需要重写视图执行等特定步骤即可完成业务开发
- 测试框架的用例执行流程:测试框架通常会定义用例执行的模板:前置准备、用例执行、结果断言、后置清理,开发者只需要实现具体的用例逻辑和断言部分
- ORM框架的数据库操作封装:ORM框架会定义数据库操作的模板流程:连接建立、SQL执行、结果映射、连接释放,不同数据库的具体连接和SQL语法由对应子类实现
使用注意事项
在使用模板方法模式时需要注意几点:
- 模板方法通常用
final类似的逻辑限制子类重写,在Python中可以通过方法命名约定或者抛出异常的默认实现来避免子类修改整体流程 - 抽象步骤方法要明确标注,让子类开发者清楚需要实现哪些方法
- 如果流程步骤较多,可以适当拆分抽象类,避免单个类过于臃肿
模板方法模式的核心价值是复用通用流程,减少重复代码,同时保证框架的整体流程可控,是框架设计中降低耦合、提升扩展性的重要手段。