news 2026/5/15 13:38:27

Python 模板方法模式

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 模板方法模式

Python 中的模板方法模式(Template Method Pattern)

模板方法模式是一种行为型设计模式,其核心目的是:
定义一个操作中的算法骨架,将一些步骤延迟到子类中实现。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。

形象比喻:就像做菜的“模板配方”——整体步骤固定(准备材料 → 烹饪 → 装盘),但具体食材和调味方式可以由不同菜系的厨师(子类)来实现。

模板方法模式的优点
  • 代码复用:算法骨架在父类中定义,避免子类重复实现
  • 控制扩展:只允许子类重写特定步骤(钩子方法)
  • 符合开闭原则:新增新变体只需新增子类
  • 一致性:保证所有子类遵循相同流程
典型应用场景
  • 框架中的生命周期方法(如 Flask 的请求处理、Django 的视图渲染)
  • 数据处理管道(读取 → 清洗 → 转换 → 保存)
  • 测试框架(setUp → runTest → tearDown)
  • 游戏流程(初始化 → 运行 → 结束)
  • 报告生成(收集数据 → 格式化 → 输出)
Python 实现示例:数据处理管道
fromabcimportABC,abstractmethodimporttime# 抽象类(AbstractClass)—— 定义模板方法classDataProcessor(ABC):# 模板方法:定义算法骨架(不可被子类重写)defprocess(self):print("=== 开始数据处理流程 ===\n")self.extract()# 步骤1:提取数据self.transform()# 步骤2:转换数据self.validate()# 步骤3:验证(可选钩子)self.load()# 步骤4:加载数据print("\n=== 数据处理完成 ===\n")# 必须由子类实现的抽象方法(Primitive Operations)@abstractmethoddefextract(self):pass@abstractmethoddefload(self):pass# 可选步骤:默认实现,子类可选择重写deftransform(self):print("默认转换:无操作")# 钩子方法(Hook):默认什么都不做,子类可重写控制流程defvalidate(self):print("默认验证:通过(可被子类重写)")returnTrue# 具体子类1:处理 CSV 文件classCSVProcessor(DataProcessor):defextract(self):print("从 CSV 文件提取数据...")time.sleep(1)self.data=["row1","row2","row3"]deftransform(self):print("转换:将数据转为大写")self.data=[row.upper()forrowinself.data]defload(self):print(f"加载到数据库:{self.data}")# 具体子类2:处理 API 数据classAPIProcessor(DataProcessor):defextract(self):print("从 REST API 获取 JSON 数据...")time.sleep(1.5)self.data={"users":["Alice","Bob"]}deftransform(self):print("转换:提取用户名字列表")self.data=self.data["users"]defvalidate(self):iflen(self.data)==0:print("验证失败:数据为空!")returnFalseprint("验证通过:数据非空")returnTruedefload(self):print(f"加载到缓存:{self.data}")# 客户端使用(无需关心具体实现)if__name__=="__main__":print("处理 CSV 数据:")csv_proc=CSVProcessor()csv_proc.process()print("\n"+"="*40+"\n")print("处理 API 数据:")api_proc=APIProcessor()api_proc.process()# 即使 validate 返回 False,也会继续执行(实际可加判断)

输出

处理 CSV 数据: === 开始数据处理流程 === 从 CSV 文件提取数据... 转换:将数据转为大写 默认验证:通过(可被子类重写) 加载到数据库:['ROW1', 'ROW2', 'ROW3'] === 数据处理完成 === ======================================== 处理 API 数据: === 开始数据处理流程 === 从 REST API 获取 JSON 数据... 转换:提取用户名字列表 验证通过:数据非空 加载到缓存:['Alice', 'Bob'] === 数据处理完成 ===
Pythonic 简化版:函数式模板(不使用继承)

Python 支持高阶函数,可以用函数组合实现“模板”:

deftemplate_process(extract_func,transform_func=None,load_func=None):defwrapper(data_source):print("=== 流程开始 ===")data=extract_func(data_source)iftransform_func:data=transform_func(data)else:print("跳过转换")print("默认验证通过")ifload_func:load_func(data)print("=== 流程结束 ===\n")returndatareturnwrapper# 定义具体步骤函数defextract_csv(source):print(f"读取 CSV:{source}")return["a","b","c"]deftransform_upper(data):return[x.upper()forxindata]defload_db(data):print(f"写入数据库:{data}")# 使用process_csv=template_process(extract_csv,transform_upper,load_db)process_csv("sales.csv")
模板方法模式结构总结
角色说明
AbstractClass抽象类,定义模板方法 + 抽象/钩子方法
template_method()算法骨架(final,不可重写)
primitive_operation()抽象方法,必须子类实现
hook()钩子方法,默认空实现或默认行为
ConcreteClass具体子类,实现抽象方法,可重写钩子
模板方法 vs 其他模式对比
模式目的扩展方式典型场景
模板方法定义算法骨架,子类实现步骤继承框架生命周期、处理流程
策略算法整体可替换组合支付方式、排序算法
工厂方法对象创建延迟到子类继承对象实例化
建造者复杂对象分步构建组合对象配置
Python 中的实用建议
  • 推荐使用继承实现:当流程固定、步骤明确时
  • 避免过度使用:Python 更倾向“组合优于继承”,如果步骤完全可替换,用策略模式更好
  • 钩子方法很实用:用于控制流程分支(如should_validate()返回 bool)
  • 实际常见例子
    • http.server.BaseHTTPRequestHandlerdo_GET()do_POST()
    • unittest.TestCasesetUp()tearDown()
    • django.views.Viewdispatch()方法
进阶:带流程控制的钩子
classAdvancedProcessor(DataProcessor):defvalidate(self):print("严格验证中...")ifnotself.data:print("验证失败,终止流程!")raiseValueError("数据为空")defprocess(self):print("开始高级流程")self.extract()self.transform()ifnotself.validate():# 钩子控制是否继续print("验证未通过,停止加载")returnself.load()

模板方法模式是框架设计的核心模式之一,它确保了流程的一致性,同时给予子类足够的灵活性。

如果你想看更多实战例子(如 Web 框架请求处理模板、游戏主循环模板、报表生成模板),或者如何与钩子结合实现条件分支,欢迎继续问!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 6:01:11

JLink驱动安装无反应?聚焦USB通信层操作指南

JLink驱动安装无反应?别急着重装,先看懂USB通信链路 你有没有遇到过这样的场景: 手握一块崭新的J-Link调试器,项目正等着烧录固件,结果插上电脑——设备管理器里 悄无声息 ;运行J-Link Installer&#…

作者头像 李华
网站建设 2026/5/14 22:39:47

Open-AutoGLM插件究竟有多强?(9大核心功能首次曝光)

第一章:Open-AutoGLM插件究竟有多强? Open-AutoGLM 是一款基于 GLM 大模型生态开发的智能化插件系统,专为提升自动化任务处理能力而设计。它不仅支持自然语言理解与生成,还能深度集成到各类企业级应用中,实现从数据解析…

作者头像 李华
网站建设 2026/5/15 7:16:31

Open-AutoGLM安装卡在第3步?专家级解决方案一次性解决5类常见报错

第一章:Windows平台部署Open-AutoGLM概述在Windows平台上部署Open-AutoGLM为本地大模型应用开发与测试提供了便捷环境。该框架结合了AutoGLM的自动化推理能力与开放架构,支持在资源受限的桌面环境中运行轻量化大语言任务。部署过程依赖Python生态与相关A…

作者头像 李华
网站建设 2026/5/15 7:16:27

BongoCat终极桌面伴侣:快速打造你的专属互动猫咪

BongoCat终极桌面伴侣:快速打造你的专属互动猫咪 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 厌倦了单调的…

作者头像 李华
网站建设 2026/5/15 7:16:29

OpenProject 开源项目管理平台:敏捷团队协作的终极解决方案

OpenProject 开源项目管理平台:敏捷团队协作的终极解决方案 【免费下载链接】taiga Taiga is a free and open-source project management for cross-functional agile teams. 项目地址: https://gitcode.com/gh_mirrors/taig/taiga 你是否曾经在项目管理中遇…

作者头像 李华
网站建设 2026/5/15 7:16:27

智谱Open-AutoGLM直接使用全攻略(新手必看的3个关键步骤)

第一章:智谱 Open-AutoGLM 直接使用概述 智谱 AI 推出的 Open-AutoGLM 是一款面向自动化自然语言处理任务的大模型工具,支持零样本与少样本学习,适用于文本分类、信息抽取、问答生成等多种场景。用户无需进行复杂微调即可通过简单接口调用实现…

作者头像 李华