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

23种设计模式 - 模板方法

模式定义

模板方法模式(Template Method Pattern)是一种行为型设计模式,它通过定义算法的骨架(固定步骤),允许子类在不改变算法结构的情况下重写特定步骤。该模式的核心是将通用流程封装在基类中,通过继承实现扩展。


模式结构

抽象基类(AbstractClass)

  • 定义模板方法 execute(),包含固定执行流程(如初始化→加工→收尾)
  • 声明纯虚函数(如 performMachining())用于子类实现可变步骤
    具体子类(ConcreteClass)
  • 实现基类中的抽象方法,定义具体加工逻辑(如钻孔、铣削)
    客户端(Client)
  • 通过基类指针/引用调用模板方法,实现多态执行

适用场景

流程标准化:数控系统中不同加工类型共享相同执行流程(如预热→加工→冷却)
代码复用:避免重复编写通用步骤代码(如设备初始化)
扩展性需求:新增加工类型只需继承基类并实现特定步骤


C++示例(数控系统场景)

场景说明:
数控系统需要统一管理不同加工类型(钻孔/铣削)的执行流程,确保所有加工任务都遵循初始化→加工→清理的标准步骤。

#include 

// 抽象基类:加工流程模板
class MachiningProcess {
public:
    // 模板方法(固定流程)
    void execute() {
        initialize();
        performMachining();
        finalize();
    }

protected:
    // 通用步骤(基类实现)
    void initialize() { 
        std::cout << "设备初始化完成" << std::endl; 
    }
    void finalize() { 
        std::cout << "清理加工环境" << std::endl << std::endl; 
    }

    // 可变步骤(子类实现)
    virtual void performMachining() = 0;
};

// 具体子类:钻孔流程
class DrillingProcess : public MachiningProcess {
protected:
    void performMachining() override {
        std::cout << "执行钻孔:转速2500rpm,深度10mm" << std::endl;
    }
};

// 具体子类:铣削流程
class MillingProcess : public MachiningProcess {
protected:
    void performMachining() override {
        std::cout << "执行铣削:进给速度500mm/min,切削宽度5mm" << std::endl;
    }
};

int main() {
    MachiningProcess* process1 = new DrillingProcess();
    process1->execute();  // 输出钻孔流程

    MachiningProcess* process2 = new MillingProcess();
    process2->execute();  // 输出铣削流程

    delete process1;
    delete process2;
    return 0;
}

输出结果

设备初始化完成  
执行钻孔:转速2500rpm,深度10mm  
清理加工环境  

设备初始化完成  
执行铣削:进给速度500mm/min,切削宽度5mm  
清理加工环境  

实现要点

模板方法封装流程:execute() 方法定义了不可变的执行顺序
钩子方法隔离变化:performMachining() 由子类实现具体加工逻辑
开闭原则:新增加工类型只需继承基类,无需修改现有代码

通过该模式,数控系统可以统一管理各类加工任务的执行流程,同时支持灵活扩展新的加工类型。

相关文章:

  • 数据结构之BST、AVL、红黑树、哈夫曼树与B族树
  • 中期检查表
  • Java学习教程,从入门到精通,Java 流(Stream)、文件(File)和IO 语法知识点及案例代码(125)
  • 基于SSM框架的宠物之家系统(有源码+论文!!!)
  • Linux升级Anacodna并配置jupyterLab
  • 【Linux】文件系统:文件fd
  • Spring Boot自动装配:约定大于配置的魔法解密
  • async/await:在前端开发中的应用
  • 【TOT】Tree-of-Thought Prompting
  • Esp32S3通过文心一言大模型实现智能语音对话
  • HarmonyOS进程通信及原理
  • 0x0000007b应用程序错误解决2
  • Kafka的生产者和消费者模型
  • 25/2/18 <算法笔记> ByteTrack
  • 赛博算命之 ”梅花易数“ 的 “JAVA“ 实现 ——从玄学到科学的探索
  • 【实用工具】基于Ubuntu的Docker加速镜像配置202502
  • QT数据库(三):QSqlQuery使用
  • AWS transit gateway 的作用
  • Qt的QTabWidget的使用
  • 深入理解Redis
  • 青年与城市共成长,第六届上海创新创业青年50人论坛将举办
  • 长和获准出售巴拿马运河港口以外的港口?外交部:该报道没有依据
  • 无畏契约新王诞生:属于电竞世界的凯泽斯劳滕奇迹
  • 5月2日,全社会跨区域人员流动量完成29275.4万人次
  • 谢震业领衔挑战世界顶尖高手,这场长三角田径钻石赛值得期待
  • 几天洗一次头发最好?终于有答案了...