当前位置: 首页 > article >正文

新谈设计模式 Chapter 21 — 模板方法模式 Template Method

Chapter 21 — 模板方法模式 Template Method灵魂速记考试卷子——题目框架一样答案各写各的。秒懂类比期末考试卷子模板第一题填空、第二题选择、第三题论述学生A按自己的理解填答案学生B按自己的理解填答案试卷框架算法骨架不变具体答案某些步骤的实现由子类决定。问题引入// 灾难现场两个类的代码 90% 一样classCSVDataMiner{voidmine(){openFile();// 相同extractCSVData();// 不同parseData();// 相同analyzeData();// 相同generateCSVReport();// 不同closeFile();// 相同}};classJSONDataMiner{voidmine(){openFile();// 相同extractJSONData();// 不同parseData();// 相同analyzeData();// 相同generateJSONReport();// 不同closeFile();// 相同}};// 6 个步骤中 4 个完全重复// 加一种格式XML再复制一遍模式结构┌───────────────────────┐ │ AbstractClass │ ├───────────────────────┤ │ templateMethod() { │ ← 模板方法定义算法骨架final │ step1(); │ 固定步骤 │ step2(); │ ← 抽象子类实现 │ step3(); │ 固定步骤 │ hook(); │ ← 钩子子类可选重写 │ step4(); │ ← 抽象子类实现 │ } │ │ step1() 具体实现 │ │ step2() 纯虚函数 │ │ step4() 纯虚函数 │ │ hook() 默认空实现 │ └───────────┬───────────┘ │ 继承 ┌───────┴───────┐ │ │ ┌───┴───┐ ┌─────┴──┐ │ClassA │ │ClassB │ │step2│ │step2 │ │step4│ │step4 │ └───────┘ └────────┘C 实现#includeiostream#includestring#includevector// 抽象类数据挖掘模板 classDataMiner{public:virtual~DataMiner()default;// 模板方法定义算法骨架不应被子类重写。// 加 virtual final 可以彻底防止子类通过多态重写// virtual void mine(const std::string path) final { ... }// 注意final 只能用于 virtual 函数非 virtual 函数加 final 是编译错误。// 这里为了简洁保持非虚非虚函数无法被多态重写只能被子类「隐藏」hiding// 大多数场景已经够用了。voidmine(conststd::stringpath){std::cout━━━ 开始数据挖掘: path ━━━\n;openFile(path);// 固定步骤autorawDataextractData();// 子类实现autodataparseData(rawData);// 固定步骤analyzeData(data);// 固定步骤if(shouldGenerateReport()){// 钩子generateReport(data);// 子类实现}closeFile();// 固定步骤std::cout━━━ 挖掘完成 ━━━\n\n;}protected:// 固定步骤基类实现voidopenFile(conststd::stringpath){std::cout 打开文件: path\n;}voidcloseFile(){std::cout 关闭文件\n;}std::vectorintparseData(conststd::stringrawData){std::cout 解析数据: rawData.size() 字节\n;return{1,2,3,4,5};// 简化}voidanalyzeData(conststd::vectorintdata){intsum0;for(intv:data)sumv;std::cout 分析数据: data.size() 条记录, 总和sum\n;}// 抽象步骤子类必须实现virtualstd::stringextractData()0;virtualvoidgenerateReport(conststd::vectorintdata)0;// 钩子子类可选重写默认返回 truevirtualboolshouldGenerateReport(){returntrue;}};// 具体类CSV 矿工 classCSVDataMiner:publicDataMiner{protected:std::stringextractData()override{std::cout 提取 CSV 数据逗号分隔\n;return1,2,3,4,5;}voidgenerateReport(conststd::vectorintdata)override{std::cout 生成 CSV 报告: data.csv\n;}};// 具体类JSON 矿工 classJSONDataMiner:publicDataMiner{protected:std::stringextractData()override{std::cout 提取 JSON 数据键值对\n;returnR({data:[1,2,3,4,5]});}voidgenerateReport(conststd::vectorintdata)override{std::cout 生成 JSON 报告: report.json\n;}};// 具体类PDF 矿工不生成报告 classPDFDataMiner:publicDataMiner{protected:std::stringextractData()override{std::cout 提取 PDF 数据OCR 识别\n;returnOCR extracted text;}voidgenerateReport(conststd::vectorint)override{// 不会被调用因为钩子返回 false}// 重写钩子PDF 不生成报告boolshouldGenerateReport()override{returnfalse;}};intmain(){CSVDataMiner csv;csv.mine(sales.csv);JSONDataMiner json;json.mine(users.json);PDFDataMiner pdf;pdf.mine(contract.pdf);}输出━━━ 开始数据挖掘: sales.csv ━━━ 打开文件: sales.csv 提取 CSV 数据逗号分隔 解析数据: 9 字节 分析数据: 5 条记录, 总和15 生成 CSV 报告: data.csv 关闭文件 ━━━ 挖掘完成 ━━━ ━━━ 开始数据挖掘: users.json ━━━ 打开文件: users.json 提取 JSON 数据键值对 解析数据: 22 字节 分析数据: 5 条记录, 总和15 生成 JSON 报告: report.json 关闭文件 ━━━ 挖掘完成 ━━━ ━━━ 开始数据挖掘: contract.pdf ━━━ 打开文件: contract.pdf 提取 PDF 数据OCR 识别 解析数据: 18 字节 分析数据: 5 条记录, 总和15 关闭文件 ━━━ 挖掘完成 ━━━钩子Hook钩子是模板方法中的可选扩展点classGame{public:voidplay(){initialize();while(!isGameOver()){// ← 这就是钩子takeTurn();}displayResults();}protected:virtualvoidinitialize()0;virtualvoidtakeTurn()0;virtualvoiddisplayResults()0;// 钩子默认实现子类可以重写virtualboolisGameOver(){returnturnCount_10;}intturnCount_0;};什么时候用✅ 适合❌ 别用多个类有相似的算法框架每个子类的流程完全不同想固定算法骨架让子类改具体步骤算法需要运行时整体替换用策略消除子类中的重复代码只有一个子类没必要防混淆Template Method vs StrategyTemplate MethodStrategy机制继承组合替换什么算法的某几个步骤整个算法决定时机编译时子类继承运行时设置策略对象灵活度低改继承要改代码高运行时换类比考试卷子框架固定导航路线完全换方案一句话分清Template Method 换零件Strategy 换整台机器。Template Method vs Factory MethodFactory Method 其实是 Template Method 的一种特殊应用——模板方法中的某个步骤恰好是创建对象。好莱坞原则模板方法遵循好莱坞原则“Don’t call us, we’ll call you.”别找我我会找你。子类不调用父类的方法而是父类的模板方法在需要的时候调用子类的实现。控制权在父类手里。现代 C 小贴士CRTP 静态模板方法经典版本的模板方法用的是运行时虚函数。如果算法骨架在编译期就能确定不需要运行时多态可以用CRTPCuriously Recurring Template Pattern奇异递归模板模式实现零开销的静态版本templatetypenameDerivedclassDataMinerBase{public:// 模板方法调用派生类的具体步骤voidmine(conststd::stringpath){openFile(path);autorawstatic_castDerived*(this)-extractData();// 静态分派autodataparseData(raw);analyzeData(data);static_castDerived*(this)-generateReport(data);// 静态分派closeFile();}protected:voidopenFile(conststd::stringpath){/* 通用实现 */}voidcloseFile(){/* 通用实现 */}std::vectorintparseData(conststd::string){return{1,2,3};}voidanalyzeData(conststd::vectorint){/* 通用实现 */}};classCSVMiner:publicDataMinerBaseCSVMiner{public:std::stringextractData(){returncsv data;}voidgenerateReport(conststd::vectorint){/* CSV 报告 */}};CRTP 的static_castDerived*(this)-method()在编译期解析没有虚函数调用开销。代价是失去运行时多态不能用基类指针统一操作不同类型的 Miner。选择法则需要运行时多态 → 经典虚函数版本编译期确定类型、追求零开销 → CRTP 版本

相关文章:

新谈设计模式 Chapter 21 — 模板方法模式 Template Method

Chapter 21 — 模板方法模式 Template Method灵魂速记:考试卷子——题目框架一样,答案各写各的。秒懂类比 期末考试: 卷子模板:第一题填空、第二题选择、第三题论述学生A:按自己的理解填答案学生B:按自己的…...

Qwen3.5-2B多模态实战:直播截图→人物动作识别→合规性审核建议

Qwen3.5-2B多模态实战:直播截图→人物动作识别→合规性审核建议 1. 引言:轻量化多模态模型的价值 Qwen3.5-2B作为一款仅20亿参数的多模态基础模型,在边缘计算和实时处理场景中展现出独特优势。相比大参数模型,它能在保持70%以上…...

猫抓浏览器扩展完全指南:一站式网页媒体资源嗅探与下载解决方案

猫抓浏览器扩展完全指南:一站式网页媒体资源嗅探与下载解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 在当今数字内容时代&am…...

观澜社张庆:用“社区剧场”让传统文化“活”在当下

“端午节除了吃粽子,还能怎么过?”2024年端午前夕,观澜社的群里跳出这条消息。社员小刘提议:“演一出屈原的故事吧!”但谁写剧本?谁演?谁做道具?大家犯了难。从“零基础”到“小剧团…...

手把手教你理解CCC数字钥匙配对:从NFC交互到KTS签名的完整流程拆解

深入解析CCC数字钥匙配对:从NFC交互到KTS签名的全流程技术实现 在智能汽车与移动设备深度融合的今天,CCC(Car Connectivity Consortium)数字钥匙已成为车联网安全认证的核心技术。本文将系统拆解车主配对流程中的关键技术环节&…...

周红伟:DeepSeek-V4技术报告暗藏的10个神级彩蛋,“炼丹玄学”也被写进论文

4月24日,DeepSeek官方账号发布了一篇名为《DeepSeek-V4 预览版:迈入百万上下文普惠时代》的文章。文章中正式宣布,“全新系列模型 DeepSeek-V4 的预览版本正式上线并同步开源。”同时,还介绍:DeepSeek-V4 拥有百万字超…...

Auto-Unlocker深度指南:解锁VMware的macOS魔法

Auto-Unlocker深度指南:解锁VMware的macOS魔法 【免费下载链接】auto-unlocker Unlocker for VMWare macOS 项目地址: https://gitcode.com/gh_mirrors/au/auto-unlocker 想象一下这样的场景:你正在Windows或Linux系统上使用VMware,想…...

ARMv8架构CPTR寄存器原理与虚拟化安全配置

1. ARMv8架构中的CPTR寄存器概述在ARMv8架构中,CPTR_EL2和CPTR_EL3(Architectural Feature Trap Registers)是控制处理器关键功能访问权限的核心系统寄存器。这些寄存器的主要作用是通过陷阱机制(Trap)实现对特定架构特…...

前端状态管理:Zustand 深度解析

前端状态管理:Zustand 深度解析 为什么 Zustand 如此重要? 在前端开发中,状态管理是一个核心问题。传统的状态管理库如 Redux 虽然功能强大,但配置复杂,学习曲线陡峭。Zustand 作为一个轻量级的状态管理库,…...

前端构建缓存:从本地到CI/CD

前端构建缓存:从本地到CI/CD 毒舌开场 嘿,前端er们!你们是不是还在为构建速度而头疼?是不是还在为CI/CD流水线的时间而抓耳挠腮?是不是还在为缓存管理而不知所措?醒醒吧!前端构建缓存来了&#…...

11111111123

33333333311...

从PCIe 3.0到5.0:接收端均衡器(CTLE/DFE)的‘军备竞赛’与选型指南

从PCIe 3.0到5.0:接收端均衡器技术演进与选型实战指南 在数据中心和高端计算设备的设计中,PCIe总线的性能直接影响着整个系统的吞吐能力。当工程师们从PCIe 3.0升级到5.0时,最棘手的挑战往往来自物理层——特别是如何让接收端准确识别经过长距…...

5分钟快速上手:AntiDupl.NET开源图片去重工具终极指南

5分钟快速上手:AntiDupl.NET开源图片去重工具终极指南 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 你是否曾为电脑中堆积如山的重复照片而烦恼&#xff…...

视频孪生:数智融合新引擎,北科软以技术创新赋能数字中国建设

在数字经济与实体经济深度融合的时代浪潮中,数字孪生技术正从概念走向广泛实践,成为驱动各行业智能化转型的核心力量。作为数字孪生领域的创新突破,视频孪生凭借实时视觉感知、虚实精准映射、全域智能决策的独特优势,为智慧城市、…...

完整指南:如何用ImageToSTL将任何图片转换为3D打印模型

完整指南:如何用ImageToSTL将任何图片转换为3D打印模型 【免费下载链接】ImageToSTL This tool allows you to easily convert any image into a 3D print-ready STL model. The surface of the model will display the image when illuminated from the left side.…...

Docker运行AI代码到底安不安全?:3类高危逃逸场景复现+4层加固策略(附可落地的yaml模板)

更多请点击: https://intelliparadigm.com 第一章:Docker Sandbox 运行 AI 代码隔离技术对比评测报告 在 AI 模型快速迭代与第三方代码频繁集成的背景下,安全可靠的沙箱执行环境成为关键基础设施。Docker 提供的轻量级容器化沙箱机制&#x…...

量子比特态矢量模拟的内存爆炸难题,如何用RAII+SIMD+稀疏张量压缩将内存占用降低92%?

更多请点击: https://intelliparadigm.com 第一章:量子比特态矢量模拟的内存爆炸难题 在经典计算机上模拟 n 个量子比特的通用量子电路时,系统状态必须用 $2^n$ 维复向量表示——即希尔伯特空间中的态矢量。当 n 增至 30,所需内存…...

代码规范检查工具

代码规范检查工具:提升代码质量的利器在软件开发过程中,代码质量直接影响项目的可维护性和稳定性。代码规范检查工具应运而生,成为开发者不可或缺的助手。这类工具通过静态分析源代码,自动检测不符合编码规范的代码片段&#xff0…...

Java 25结构化并发落地清单(含Checklist.xlsx+ByteBuddy增强插件+Prometheus监控埋点模板),仅限首批200家ISV申请下载

更多请点击: https://intelliparadigm.com 第一章:Java 25结构化并发的核心演进与工业适配意义 Java 25正式将结构化并发(Structured Concurrency)从孵化器模块 jdk.incubator.concurrent 提升为标准 API(java.util.…...

VS Code Dev Containers性能对比评测报告(2024真实基准测试数据曝光)

更多请点击: https://intelliparadigm.com 第一章:VS Code Dev Containers性能对比评测报告(2024真实基准测试数据曝光) 为验证 Dev Containers 在不同宿主环境下的实际开销,我们在 macOS Sonoma(M2 Ultra…...

一篇文章带你了解C++(STL基础、Vector)

STL(Standard Template Library,标准模板库)STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数STL六大组件STL大体分为六大组件,分别是:容器、算法、迭代器…...

迁移学习滚动轴承复合故障诊断【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)联合分布自适应对抗网络用于跨工况复合故障诊断&am…...

250+ Xshell配色方案终极指南:快速打造专业级终端界面

250 Xshell配色方案终极指南:快速打造专业级终端界面 【免费下载链接】Xshell-ColorScheme 250 Xshell Color Schemes 项目地址: https://gitcode.com/gh_mirrors/xs/Xshell-ColorScheme Xshell-ColorScheme 是一个包含超过250个专业配色方案的完整资源库&am…...

Unity动态图像终极解决方案:UniGif GIF解码器深度解析与实战指南

Unity动态图像终极解决方案:UniGif GIF解码器深度解析与实战指南 【免费下载链接】UniGif GIF image decoder for Unity. 项目地址: https://gitcode.com/gh_mirrors/un/UniGif 在Unity游戏开发中,动态图像的集成一直是开发者面临的挑战。原生Uni…...

别再纠结选哪个了!一文讲透WPS里VBA宏和JS宏到底该怎么选(2024版)

WPS自动化开发终极指南:VBA宏与JS宏的深度抉择(2024实战版) 当电子表格里的重复操作开始吞噬你的工作时间,自动化就成了职场人士的救生筏。在WPS这个国产办公软件的生态里,VBA宏和JS宏就像两条平行的自动化轨道&#x…...

LinkSwift:八大网盘直链下载,解锁你的宽带潜能

LinkSwift:八大网盘直链下载,解锁你的宽带潜能 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / …...

Dev Containers 调试响应延迟>3s?抓取strace+perf+VS Code Extension Host日志的6步精准归因法(附火焰图生成脚本)

更多请点击: https://intelliparadigm.com 第一章:Dev Containers 调试响应延迟>3s?问题现象与影响评估 当使用 VS Code Remote - Containers 扩展启动调试会话时,开发者常观察到断点命中后需等待 3–8 秒才进入调试器…...

BiliTools终极指南:如何用一款工具搞定B站视频下载与弹幕处理

BiliTools终极指南:如何用一款工具搞定B站视频下载与弹幕处理 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools…...

ZGC低延迟承诺崩塌?从G1迁移失败案例看Java 25中ZGC 2.0的4个硬性准入条件

更多请点击: https://intelliparadigm.com 第一章:ZGC 2.0低延迟承诺的底层契约重审 ZGC 2.0 并非简单性能微调,而是对 JVM 垃圾回收“低延迟契约”的一次系统性重定义——它将最大暂停时间硬性约束从 10ms 下探至 1ms 级别,并要…...

C++实时控制代码如何通过TÜV认证?(功能安全编码验证全流程解密)

更多请点击: https://intelliparadigm.com 第一章:C实时控制代码TV认证概览 TV认证是工业自动化、轨道交通、医疗设备等安全关键领域中C实时控制软件获得市场准入的核心合规门槛。该认证并非仅针对编译结果,而是贯穿整个开发生命周期——从需…...