当前位置: 首页 > 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://www.lryc.cn/news/589262.html

相关文章:

  • GeoTools 工厂设计模式
  • MySQL高级篇(二):深入理解数据库事务与MySQL锁机制
  • 智驾芯片软件分层测试
  • Spring 中 @Component和@Bean注解的区别
  • 背包问题(包括路径统计)
  • zynq分频的例子
  • HTML的重要知识
  • 自己训练大模型?MiniMind 全流程解析 (一) 预训练
  • Vue框架之模板语法(插值表达式、指令系统、事件处理和表单绑定)全面解析
  • 代码随想录Day21:二叉树(修剪二叉搜索树、将有序数组转换为二叉搜索树、把二叉搜索树转换为累加树——全递归版本以及总结)
  • JavaDemo——使用CGLIB动态代理
  • 46. 携带研究材料(01背包二维数组)
  • (李宏毅)deep learning(五)--learning rate
  • Spring应用抛出NoHandlerFoundException、全局异常处理、日志级别
  • 游戏加速器核心技术:动态超发
  • Postman + Newman + Jenkins 接口自动化测试
  • 【PTA数据结构 | C语言版】二叉树层序序列化
  • MYSQL练习2
  • UVM(1)—配置环境
  • 3分钟搞定!用ChatGPT+工具生成流程图超简单(附提示词)
  • 基于 AI 的大前端安全态势感知与应急响应体系建设
  • 证明在赋范线性空间中,如果一个闭子空间内的点列弱收敛于空间中的一个点,那么这个点也必然属于该闭子空间
  • 稳定细胞系构建|蛋白表达细胞株|高表达细胞株
  • 备忘录设计模式
  • Python+Selenium自动化爬取携程动态加载游记
  • MIPI DSI(四) video 和 command 模式
  • MySQL数学函数
  • 【STM32项目】环境监测设计
  • QML视图与代理控件
  • Spring Boot全局异常处理:打造坚如磐石的应用防线