一、模式定义与核心结构
模板方法模式(Template Method Pattern) 是一种行为型设计模式,通过定义算法骨架将可变步骤延迟到子类实现。其核心结构包含:
from abc import ABC, abstractmethod
class AbstractClass(ABC):
def template_method(self):
"""定义算法骨架,调用基本方法和钩子方法"""
self.basic_operation1()
if self.hook():
self.basic_operation2()
@abstractmethod
def basic_operation1(self):
"""必须由子类实现的基本操作"""
pass
def basic_operation2(self):
"""可复用的具体方法"""
print("默认的具体操作")
def hook(self):
"""钩子方法,提供默认实现"""
return True
class ConcreteClass(AbstractClass):
def basic_operation1(self):
print("子类实现的具体操作1")
def hook(self):
"""覆盖钩子方法改变流程"""
return False
二、关键要素解析
-
模板方法(template_method)
- 封装算法流程,标记为
final
(Python中通过命名规范实现) - 调用抽象方法、具体方法和钩子方法
- 封装算法流程,标记为
-
基本方法分类
方法类型 描述 实现位置 抽象方法 必须由子类实现的步骤 抽象类 具体方法 所有子类共享的通用实现 抽象类 钩子方法 可选覆盖的控制点 抽象类(带默认实现)
三、典型应用场景
场景1:数据处理流水线
class DataProcessor(ABC):
def process(self):
"""模板方法定义处理流程"""
self.load_data()
self.clean_data()
self.analyze_data()
self.save_results()
@abstractmethod
def load_data(self):
pass
@abstractmethod
def clean_data(self):
pass
def analyze_data(self):
print("执行通用数据分析")
def save_results(self):
print("保存结果到CSV文件")
class CSVProcessor(DataProcessor):
def load_data(self):
print("加载CSV数据")
def clean_data(self):
print("处理CSV格式数据")
class JSONProcessor(DataProcessor):
def load_data(self):
print("加载JSON数据")
def clean_data(self):
print("处理JSON格式数据")
def save_results(self):
print("保存结果到JSON文件") # 覆盖父类方法
场景2:Web框架请求处理
Django框架中的类视图广泛使用模板方法模式:
class BaseView:
def dispatch(self, request):
"""模板方法控制请求流程"""
self.setup(request)
if not self.pre_check():
return HttpResponseBadRequest()
response = self.handle()
self.cleanup()
return response
def setup(self, request):
"""初始化操作"""
print("初始化视图环境")
@abstractmethod
def handle(self):
"""子类必须实现的业务逻辑"""
pass
def pre_check(self):
"""权限校验钩子"""
return True
def cleanup(self):
"""资源释放"""
print("清理视图资源")
class DetailView(BaseView):
def handle(self):
print("处理详情页逻辑")
return HttpResponse("Detail Page")
四、模式优缺点分析
优点 | 缺点 |
---|---|
1. 代码复用率提升30%-50% | 1. 类数量增加20%-40% |
2. 符合开闭原则(OCP) | 2. 过度使用导致类结构复杂 |
3. 算法流程可视化 | 3. 父类变更影响所有子类 |
4. 反向控制结构(好莱坞原则) |
五、实战建议
-
钩子方法使用技巧
class ReportGenerator(ABC): def generate(self): self.collect_data() if self.need_format(): # 钩子控制流程 self.format_data() self.output() def need_format(self): """默认不格式化""" return False
-
与策略模式的对比
特性 模板方法模式 策略模式 实现方式 继承 组合 流程控制 父类固定 客户端动态选择 典型应用 框架设计(如Django) 支付方式切换(支付宝/微信)
六、总结
模板方法模式是构建可扩展系统的基石,特别适合:
- 存在多个相似算法流程的场景
- 需要严格控制执行顺序的业务
- 框架级代码开发
通过合理使用钩子方法和抽象方法,能在保持算法稳定性的同时,赋予子类足够的灵活性。建议在实际开发中结合Python的ABC模块和类型提示,提升代码健壮性。