c++如何实现模板方法模式 c++设计模式之Template Method【实例】

发布时间 - 2025-12-25 00:00:00    点击率:
模板方法模式通过抽象基类定义算法骨架,将可变步骤延迟至派生类实现:基类以public final函数封装流程,protected virtual纯虚函数留扩展点,支持钩子机制与现代C++优化。

模板方法模式在C++中通过抽象基类定义算法骨架,将可变步骤延迟到派生类实现。核心是用virtual(常为protected)纯虚函数留出扩展点,用final防止关键步骤被重写,再以public非虚函数封装完整流程。

定义抽象模板类

声明一个含公共入口函数的基类,把不变逻辑写在该函数内,变化部分抽成受保护的虚函数:

  • 构造函数/析构函数设为protecteddefault,避免直接实例化
  • 模板主函数(如execute())为publicfinal,确保算法结构不被破坏
  • 子步骤(如step1()step2())为protectedvirtual,其中纯虚函数强制子类实现

派生类实现具体步骤

继承抽象类后,只重写需要定制的虚函数,不改变整体调用顺序:

  • 若某步有默认行为,基类中提供带实现的virtual函数;若必须重写,则用= 0声明纯虚
  • 可添加新成员变量或辅助函数,但不新增对外接口——所有交互仍走execute()
  • 示例:咖啡和茶的冲泡流程共用“烧水→冲泡→倒杯→加料”,仅“冲泡”和“加料”不同

支持钩子机制与默认行为

用带空实现的虚函数作为钩子(Hook),让子类选择性介入:

  • 例如isAddCondiments() { return true; },子类可重写返回false跳过加料
  • 钩子函数通常protectedvirtual、有默认实现,不影响主流程完整性
  • 避免在模板函数中直接调用private函数——那会封闭扩展能力

现代C++优化写法

C++11起可用override显式标注重写,C++17可结合if constexpr做编译期分支(适用于策略已知的场景):

  • 抽象类中用[[nodiscard]]标记execute(),提醒调用者注意返回值
  • 对无需多态的简单场景,也可用函数对象+模板参数替代继承(即“策略模式+模板”混合),但失去运行时切换能力
  • 慎用std::function代替虚函数——动态分配开销大,且破坏了模板方法的静态结构约束

不复杂但容易忽略:模板方法的价值不在代码量,而在把“什么不变”和“什么可变”清晰分离。只要基类里execute()没被绕过,算法一致性就始终可控。


# c++  # if  # 封装  # 多态  # 成员变量  # 子类  # 构造函数  # 析构函数  # 继承  # 虚函数  # 纯虚函数  # 接口  # public  # private  # protected  # function  # 对象  # default  # 算法  # 重写  # 派生类  # 抽象类  # 设为  # 而在  # 适用于  # 不被  # 但不  # 写在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Android实现代码画虚线边框背景效果  如何挑选高效建站主机与优质域名?  如何在宝塔面板创建新站点?  如何在Windows 2008云服务器安全搭建网站?  音响网站制作视频教程,隆霸音响官方网站?  Linux安全能力提升路径_长期防护思维说明【指导】  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  Python函数文档自动校验_规范解析【教程】  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何在IIS中新建站点并配置端口与IP地址?  JS去除重复并统计数量的实现方法  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  Python高阶函数应用_函数作为参数说明【指导】  如何在万网自助建站中设置域名及备案?  Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  教你用AI润色文章,让你的文字表达更专业  如何快速查询域名建站关键信息?  网站制作壁纸教程视频,电脑壁纸网站?  晋江文学城电脑版官网 晋江文学城网页版直接进入  HTML 中动态设置元素 name 属性的正确语法详解  Android利用动画实现背景逐渐变暗  清除minerd进程的简单方法  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  微信小程序 canvas开发实例及注意事项  如何用AWS免费套餐快速搭建高效网站?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  轻松掌握MySQL函数中的last_insert_id()  移动端脚本框架Hammer.js  JS中对数组元素进行增删改移的方法总结  javascript如何操作浏览器历史记录_怎样实现无刷新导航  网站页面设计需要考虑到这些问题  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  如何快速搭建安全的FTP站点?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  如何用免费手机建站系统零基础打造专业网站?  Laravel如何创建自定义中间件?(Middleware代码示例)  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  Laravel如何处理表单验证?(Requests代码示例)  laravel怎么为API路由添加签名中间件保护_laravel API路由签名中间件保护方法  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】