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

Template Method 设计模式

模板方法模式(Template Method Pattern) 是一种 行为型设计模式,用于定义 算法的骨架,并允许子类在不改变算法结构的情况下 重新定义 其中的某些步骤。

核心思想:

  • 基类 中定义 算法的整体流程(骨架),但具体的实现留给 子类
  • 基类 只负责调用流程,具体逻辑由 子类 来实现,符合 “开放封闭原则”(对扩展开放,对修改封闭)。

1. 结构

类图

+----------------------+
|   AbstractClass      |  (抽象类)
+----------------------+
| + templateMethod()   |  (定义算法的骨架)
| + step1()            |  (基本方法,可能有默认实现)
| + step2()            |  (抽象方法,交由子类实现)
+----------------------+
         ▲
         │
+----------------------+
|   ConcreteClass      |  (具体子类)
+----------------------+
| + step2()           |  (实现父类的抽象方法)
+----------------------+

代码示例

#include <iostream>

// 抽象类,定义算法骨架
class AbstractClass {
public:
    // Template Method,定义算法的框架
    void templateMethod() {
        step1();     // 固定实现
        step2();     // 交给子类实现
        step3();     // 固定实现
    }

protected:
    void step1() {  // 提供默认实现
        std::cout << "Step 1: 基类的实现" << std::endl;
    }

    virtual void step2() = 0; // 纯虚函数,子类必须实现

    void step3() {  // 提供默认实现
        std::cout << "Step 3: 基类的实现" << std::endl;
    }
};

// 具体子类,实现 step2
class ConcreteClass : public AbstractClass {
protected:
    void step2() override {
        std::cout << "Step 2: 子类的实现" << std::endl;
    }
};

int main() {
    ConcreteClass obj;
    obj.templateMethod();  // 调用模板方法
    return 0;
}

2. 关键点

  1. templateMethod()基类 中定义算法的结构,并且不允许子类重写
  2. 部分方法(step1step3 在基类中有默认实现,子类可以直接继承。
  3. 部分方法(step2virtual(纯虚函数),子类必须实现自己的逻辑。

3. 适用场景

场景原因
多个类的算法流程相同,但部分步骤不同避免重复代码,提高复用性
算法的某些步骤可能会变化,但主流程不变通过子类扩展,而不影响基类
需要控制子类扩展的范围只允许子类修改某些特定步骤

相关文章:

  • 企业数字化过程中数据仓库与商业智能 BI的目标
  • 算法-二叉树篇04-翻转二叉树
  • 开源软件的版权保护措施
  • JavaEE 编写Java程序,实现一个简单的echo程序(网络编程UDP实践练习)
  • 【Linux】learning notes(3)make、copy、move、remove
  • 1472.设计浏览器历史记录
  • 阿里重磅模型深夜开源;DeepSeek宣布开源DeepGEMM;微软开源多模态AI Agent基础模型Magma...|网易数智日报
  • 如何看待 Kaiming He 最新提出的 Fractal Generative Models ?
  • JAVA-如何理解Mysql的索引
  • 004 Kafka异常处理
  • SQL命令详解之操作数据库
  • 初会学习记录
  • Metal 学习笔记五:3D变换
  • SpringBoot接入DeepSeek(硅基流动版)+ 前端页面调试
  • w803|联盛德|WM IoT SDK2.X测试|pinout|(2):w803开发板简介
  • 仿12306购票系统(3)
  • 可狱可囚的爬虫系列课程 15:防盗链反爬虫的处理
  • Bitbucket 设置SSH KEY方法
  • 【DeepSeek探索篇(四)】高效学习与工作,从搭建DeepSeek个人知识库开始!
  • 学习Flask:[特殊字符] Day 3:数据库集成
  • 这就是上海!
  • 南京航空航天大学启动扁平化改革:管理岗规模控制在20%,不再统一设科级机构
  • 浙商银行外部监事高强无法履职:已被查,曾任建行浙江省分行行长
  • 成都警方:在地铁公共区域用改装设备偷拍女乘客,男子被行拘
  • 金科服务:大股东博裕资本提出无条件强制性现金要约收购,总代价约17.86亿港元
  • 法治日报调查直播间“杀熟”乱象:熟客越买越贵,举证难维权不易