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

设计模式一: 模板方法模式 (Template Method Pattern)

模板方法模式是一种行为设计模式,它通过定义一个算法的骨架,而将一些步骤延迟到子类中实现。Template Method 使得子类可以不改变(复用)一个算法结构 即可重定义(override 重写)该算法的某些特定步骤。

基本结构

// 抽象类定义模板方法和基本操作
class AbstractClass {
public:// 模板方法,定义算法骨架(通常声明为final防止子类覆盖)void templateMethod() const {this->baseOperation1();this->requiredOperation1();this->baseOperation2();this->requiredOperation2();}// 基类中已实现的操作void baseOperation1() const {std::cout << "AbstractClass: 执行基础操作1\n";}void baseOperation2() const {std::cout << "AbstractClass: 执行基础操作2\n";}// 需要子类实现的纯虚函数virtual void requiredOperation1() const = 0;virtual void requiredOperation2() const = 0;// 虚析构函数virtual ~AbstractClass() = default;
};

开发人员只需继承AbstractClass  重写其中的虚函数然后调用templateMethod()即可

/ 具体实现类1
class ConcreteClass1 : public AbstractClass {
public:void requiredOperation1() const override {std::cout << "ConcreteClass1: 实现操作1\n";}void requiredOperation2() const override {std::cout << "ConcreteClass1: 实现操作2\n";}
};// 具体实现类2(带钩子方法覆盖)
class ConcreteClass2 : public AbstractClass {
public:void requiredOperation1() const override {std::cout << "ConcreteClass2: 实现操作1\n";}void requiredOperation2() const override {std::cout << "ConcreteClass2: 实现操作2\n";}void hook() const override {std::cout << "ConcreteClass2: 覆盖钩子方法\n";}
};

具体调用

int main() {std::cout << "同一客户端代码可以处理不同子类:\n";AbstractClass *concreteClass1 = new ConcreteClass1();concreteClass1->templateMethod();std::cout << "\n同一客户端代码可以处理不同子类:\n";AbstractClass *concreteClass2 = new  ConcreteClass2();concreteClass2->templateMethod();return 0;
}

uml图

应用场景

  1. 框架设计:定义框架的流程,允许用户自定义特定步骤

  2. 算法骨架固定:当多个类有相似算法但实现细节不同时

  3. 代码复用:将公共行为提取到父类中

  4. 控制子类扩展:限制子类只能修改算法的特定部分

优点

  1. 提高代码复用性,避免重复代码

  2. 良好的扩展性,符合开闭原则

  3. 便于维护,算法修改只需在父类中进行

  4. 反向控制结构,父类控制整体流程

缺点

  1. 每个不同的实现都需要一个子类,可能导致类数量增加

  2. 通过继承实现,可能违反组合优于继承的原则

  3. 父类与子类之间紧密耦合

实际应用示例

  1. STL中的分配器(allocator):定义内存分配算法框架

  2. GUI框架:如窗口显示流程固定,具体绘制由子类实现

  3. 单元测试框架:定义测试流程(setUp, test, tearDown)

  4. 编译器设计:编译流程固定,具体语法分析等步骤可变


文章转载自:
http://aneuploid.zzgtdz.cn
http://aruspicy.zzgtdz.cn
http://axone.zzgtdz.cn
http://anthozoic.zzgtdz.cn
http://ccsa.zzgtdz.cn
http://antiauthority.zzgtdz.cn
http://brasil.zzgtdz.cn
http://bondsman.zzgtdz.cn
http://aslant.zzgtdz.cn
http://abstractly.zzgtdz.cn
http://apocrine.zzgtdz.cn
http://azalea.zzgtdz.cn
http://baiza.zzgtdz.cn
http://chamberlaine.zzgtdz.cn
http://avast.zzgtdz.cn
http://bespeckle.zzgtdz.cn
http://celotomy.zzgtdz.cn
http://camcorder.zzgtdz.cn
http://caleche.zzgtdz.cn
http://chirm.zzgtdz.cn
http://catoptromancy.zzgtdz.cn
http://caterpillar.zzgtdz.cn
http://cantoris.zzgtdz.cn
http://boarhound.zzgtdz.cn
http://boodle.zzgtdz.cn
http://atheistical.zzgtdz.cn
http://c.zzgtdz.cn
http://cerebella.zzgtdz.cn
http://bannerol.zzgtdz.cn
http://bulkhead.zzgtdz.cn
http://www.dtcms.com/a/280651.html

相关文章:

  • Nexus 私服管理工具
  • 李宏毅《生成式人工智能导论》 | 第11讲-第14讲:大型语言模型的可解释性、能力评估、安全性
  • 20250715问答课题-基于BERT与混合检索问答系统
  • 电商缓存强一致方案:数据库锁保障
  • 设计模式开篇:设计模式的七大核心原则
  • kube-proxy 中 IPVS 与 iptables
  • PyTorch笔记7----------计算机视觉基础
  • OpenCV 伽马校正函数gammaCorrection()
  • MODIS_Landsat_Sentinel2星源分幅简述【20250715】
  • 视频编码中熵编码之基于上下文的变长编码(Huffman霍夫曼编码和指数哥伦布)
  • 【YOLOv11-目标检测】06-模型部署(C++)
  • 06_pt-table-sync 工具解决 MySQL 主从数据不一致
  • conda环境保存(后期再来整理)
  • etcd自动压缩清理
  • 2-Nodejs运行JS代码
  • iOS高级开发工程师面试——Swift
  • Fiddler 中文版抓包实战 构建标准化调试流程提升团队协作效率
  • echarts 绘制3D中国地图
  • React强大且灵活hooks库——ahooks入门实践之开发调试类hook(dev)详解
  • PostgreSQL 数据库中 ETL 操作的实战技巧
  • React源码6 三大核心模块之一:commit, finishConcurrentRender函数
  • 前端学习笔记:React.js中state和props的区别和联系
  • haproxy负载均衡
  • AntV G6 基础元素详解(React版)
  • 【PTA数据结构 | C语言版】创建哈夫曼树
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第二十一讲)
  • 【PDF识别改名】使用京东云OCR完成PDF图片识别改名,根据PDF图片内容批量改名详细步骤和解决方案
  • 同样是“跳转”,为何forward地址栏不变,redirect会变?
  • RNN、GRU 与 LSTM 计算成本深入对比
  • 基于光场相机的激光增材制造熔池温度场原位多眼监测​​