Python设计模式详解之13 —— 模板方法模式

Template Method 设计模式 是一种行为型设计模式,用于定义一个操作的骨架,将某些步骤延迟到子类中实现,从而允许子类在不改变整体算法结构的情况下重新定义某些步骤。

在 Python 中,Template Method 模式通常使用基类的方法来定义通用算法框架,并通过子类覆盖特定步骤实现具体逻辑。


结构

  1. 抽象类: 提供算法的骨架,包含模板方法(定义算法步骤的顺序)和一些需要子类实现的抽象方法。
  2. 具体类: 实现抽象方法,定义算法的具体步骤。

代码示例

python 复制代码
from abc import ABC, abstractmethod

class AbstractWorkflow(ABC):
    """抽象类,定义算法的骨架"""

    def template_method(self):
        """模板方法,定义算法的框架"""
        self.step_one()
        self.step_two()
        self.hook()  # 可选步骤
        self.step_three()

    def step_one(self):
        """通用步骤"""
        print("Step 1: Common implementation.")

    @abstractmethod
    def step_two(self):
        """需要子类实现的抽象方法"""
        pass

    @abstractmethod
    def step_three(self):
        """需要子类实现的抽象方法"""
        pass

    def hook(self):
        """钩子方法,子类可选择性覆盖"""
        print("Default hook: Optional step.")

class ConcreteWorkflowA(AbstractWorkflow):
    """具体实现 A"""

    def step_two(self):
        print("Step 2 (A): Specific implementation for A.")

    def step_three(self):
        print("Step 3 (A): Specific implementation for A.")

class ConcreteWorkflowB(AbstractWorkflow):
    """具体实现 B"""

    def step_two(self):
        print("Step 2 (B): Specific implementation for B.")

    def step_three(self):
        print("Step 3 (B): Specific implementation for B.")

    def hook(self):
        print("Custom hook: Overridden by B.")

# 客户端代码
def client_code(workflow: AbstractWorkflow):
    workflow.template_method()

if __name__ == "__main__":
    print("Running ConcreteWorkflowA:")
    client_code(ConcreteWorkflowA())

    print("\nRunning ConcreteWorkflowB:")
    client_code(ConcreteWorkflowB())

运行结果

plaintext 复制代码
Running ConcreteWorkflowA:
Step 1: Common implementation.
Step 2 (A): Specific implementation for A.
Default hook: Optional step.
Step 3 (A): Specific implementation for A.

Running ConcreteWorkflowB:
Step 1: Common implementation.
Step 2 (B): Specific implementation for B.
Custom hook: Overridden by B.
Step 3 (B): Specific implementation for B.

模式要点

  1. 模板方法: 定义算法骨架,控制步骤的调用顺序。
  2. 抽象方法: 强制子类实现特定步骤。
  3. 钩子方法: 提供可选的扩展点,允许子类覆盖。
  4. 封装不变部分: 将通用逻辑放在基类中,确保不被子类破坏。
  5. 开放/封闭原则: 算法结构对扩展开放,对修改封闭。

优点

  • 避免重复代码,将通用逻辑提取到基类。
  • 子类只需关注特定步骤的实现,简化开发。
  • 灵活扩展特定步骤,而无需修改算法框架。

缺点

  • 如果算法步骤较多,可能导致类数量增加。
  • 继承限制了灵活性,无法动态改变算法步骤。

适用场景

  • 多个子类需要共享算法的通用部分。
  • 需要通过子类定制算法的某些步骤。
相关推荐
ATMQuant2 分钟前
量化策略开发08:Lasso因子选择 - 因子动物园的断舍离
python·量化交易·lasso·vnpy·多因子选股
ATMQuant2 小时前
量化指标解码21:逻辑回归支撑阻力 - 让逻辑回归给关键价位打分
python·机器学习·逻辑回归·量化交易·技术指标
q0371803 小时前
深色 IDE 截图 OCR 老是漏字,我加了一层预处理,顺手把识别结果做成了可搜索历史
python
蜗牛8753 小时前
个人机票监控开源项目:6 个平台、10 条通道的自托管方案
python
秋名山小白4 小时前
Playwright UI 自动化测试实战教程
python·ui
AI源码5 小时前
基于 Python 的汽车市场数据分析与可视化平台
python·数据分析·汽车
会飞锦鲤5 小时前
基于 SVM + HOG 的铸造缺陷检测系统
python·opencv·机器学习·计算机视觉·缺陷检测·图像分类·svm
starrysky8106 小时前
zipfile 中文乱码修复:把已知 GBK 旧 ZIP 解压到正确中文目录
python
用户91294046848426 小时前
Codex 从零到能交付(09):让 Codex 写有用的测试,而不是只测成功路径
python
2601_967987376 小时前
Debian如何配置Python调试工具
python·debian·pdb·调试工具·ipdb