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

embedded/2024/11/27 1:43:51/

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

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


结构

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

代码示例

python">from abc import ABC, abstractmethodclass 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.")@abstractmethoddef step_two(self):"""需要子类实现的抽象方法"""pass@abstractmethoddef step_three(self):"""需要子类实现的抽象方法"""passdef 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())

运行结果

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. 开放/封闭原则: 算法结构对扩展开放,对修改封闭。

优点

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

缺点

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

适用场景

  • 多个子类需要共享算法的通用部分。
  • 需要通过子类定制算法的某些步骤。

http://www.ppmy.cn/embedded/140783.html

相关文章

在 C# 中使用 WebClient 实现文件上传,并在 IIS 上部署应用程序

在 C# 中使用 WebClient 实现文件上传,并在 IIS 上部署应用程序 步骤 1: 创建文件上传的 ASP.NET 应用程序步骤 2: 使用 WebClient 上传文件步骤 3: 在 IIS 上部署应用程序总结 在 C# 中使用 WebClient 实现文件上传,并在 IIS 上部署应用程序&#xff0c…

web 中 canvas 污染 以及解决方案

在Web开发中,Canvas 污染(Canvas Tainting)是一个与安全相关的概念,通常发生在使用 元素时。为了更好理解它,我们可以从以下几个方面来解释: 1. Canvas 元素简介 HTML 元素允许开发者在网页上绘制图形&…

React 组件生命周期

React 组件生命周期 React 组件生命周期是React框架中一个核心概念,它描述了一个组件从创建到销毁的过程。理解组件生命周期对于高效开发React应用至关重要,因为它允许开发者在一个组件的不同阶段执行特定的逻辑。本文将详细介绍React组件的生命周期方法,并解释它们在组件的…

自由学习记录(23)

Lua的学习 table.concat(tb,";") 如果表里带表,则不能拼接,表里带nil也不能,都会报错 true和false也不可以,数字和字符串可以 if要和一个end配对,所以 if a>b then return true end end 两个end …

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了,而且Vue项目就应该正经走项目流程啊喂! npm i amap/amap-jsapi-loader --save 官方说这样执行完,就这结束啦!它结束了,我还没有,不然不可能记录这篇文…

应用商店双弹窗“APP在向用户申请权限时未同步告知用户申请此权限的理由”驳回uni-app应用上线的解决方法

目录 问题分析 解决方法 下载插件包:x-perm-apply-instr 将插件包导入进你项目中的uni_modules文件夹 在项目中的main.js文件中添加以下代码 完成 其它注意事项 addPermisionInterceptor 添加 uniApi 调用拦截 removePermisionInterceptor 移除 uniApi 调用…

Android开发教程案例源码分享-匹配动画多个头像飘动效果

Android开发教程案例源码分享-匹配动画多个头像飘动效果 匹配往往出现多个头像飘动,吸引人点击,有时出现的位置还不固定 一、思路: 用MotionLayout 二、效果图: 看视频更直观点: Android开发教程案例源码分享-匹配…

Redis Key 命名规范文档

开发过程中为确保 Redis 键名的一致性、可读性和易维护性,本规范旨在指导开发团队在使用 Redis 时设计合理的键名格式。 1. 命名格式 采用 模块:子模块:业务描述:标识 的分层格式,明确数据来源和用途。 层次清晰:从全局到具体逐步细化。唯一…