2026/4/1 17:46:51
网站建设
项目流程
html动态页面代码,seo外包方案,玩具电子商务网站建设论文,下载浙江平安建设信息系统网站Python 中的模板方法模式#xff08;Template Method Pattern#xff09;
模板方法模式是一种行为型设计模式#xff0c;其核心目的是#xff1a; 定义一个操作中的算法骨架#xff0c;将一些步骤延迟到子类中实现。模板方法使得子类可以不改变算法结构的情况下#xff…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 Operationsabstractmethoddefextract(self):passabstractmethoddefload(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.dataself.data[users]defvalidate(self):iflen(self.data)0:print(验证失败数据为空)returnFalseprint(验证通过数据非空)returnTruedefload(self):print(f加载到缓存{self.data})# 客户端使用无需关心具体实现if__name____main__:print(处理 CSV 数据)csv_procCSVProcessor()csv_proc.process()print(\n*40\n)print(处理 API 数据)api_procAPIProcessor()api_proc.process()# 即使 validate 返回 False也会继续执行实际可加判断输出处理 CSV 数据 开始数据处理流程 从 CSV 文件提取数据... 转换将数据转为大写 默认验证通过可被子类重写 加载到数据库[ROW1, ROW2, ROW3] 数据处理完成 处理 API 数据 开始数据处理流程 从 REST API 获取 JSON 数据... 转换提取用户名字列表 验证通过数据非空 加载到缓存[Alice, Bob] 数据处理完成 Pythonic 简化版函数式模板不使用继承Python 支持高阶函数可以用函数组合实现“模板”deftemplate_process(extract_func,transform_funcNone,load_funcNone):defwrapper(data_source):print( 流程开始 )dataextract_func(data_source)iftransform_func:datatransform_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_csvtemplate_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.BaseHTTPRequestHandler的do_GET()、do_POST()unittest.TestCase的setUp()、tearDown()django.views.View的dispatch()方法进阶带流程控制的钩子classAdvancedProcessor(DataProcessor):defvalidate(self):print(严格验证中...)ifnotself.data:print(验证失败终止流程)raiseValueError(数据为空)defprocess(self):print(开始高级流程)self.extract()self.transform()ifnotself.validate():# 钩子控制是否继续print(验证未通过停止加载)returnself.load()模板方法模式是框架设计的核心模式之一它确保了流程的一致性同时给予子类足够的灵活性。如果你想看更多实战例子如 Web 框架请求处理模板、游戏主循环模板、报表生成模板或者如何与钩子结合实现条件分支欢迎继续问