C++ 模板方法模式详解

[复制链接]
发表于 2025-9-10 17:04:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
模板方法模式(Template Method Pattern)是一种行为操持模式,它在父类中定义算法的框架,而将一些步调的详细实现延迟到子类中,使得子类可以不改变算法布局的情况下重定义某些特定步调。
核心概念

操持原则

模板方法模式遵照以下操持原则:

  •         好莱坞原则:"不要调用我们,我们会调用你" - 父类控制流程,子类提供实现
  •         开闭原则:对扩展开放(通过子类化),对修改关闭(不修改算法布局)
  •         单一职责原则:将可变部分分离到差别方法中
主要长处


  •         代码复用:将公共行为放在父类中
  •         反向控制:父类控制流程,子类提供细节
  •         机动性:可以覆盖特定步调而不改变布局
  •         扩展性:容易添加新的详细实现
模式布局

主要组件


  •         AbstractClass(抽象类)

    •                 定义模板方法和抽象的根本操纵
    •                 模板方法调用根本操纵完成算法
           
  •         ConcreteClass(详细类)

    •                 实现抽象类定义的根本操纵
    •                 可以覆盖某些默认实现
           
完整代码示例
  1. #include <iostream>
  2. #include <memory>
  3. #include <string>
  4. // ==================== 抽象类 ====================
  5. class DataProcessor {
  6. protected:
  7.     // 基本操作 - 由子类实现
  8.     virtual void readData() = 0;
  9.     virtual void processData() = 0;
  10.     virtual void writeData() = 0;
  11.    
  12.     // 钩子方法 - 可选覆盖
  13.     virtual bool shouldValidate() const { return true; }
  14.     virtual void validateData() {
  15.         std::cout << "默认数据验证..." << std::endl;
  16.     }
  17.    
  18.     // 具体方法 - 公共实现
  19.     void openConnection() {
  20.         std::cout << "打开数据库连接..." << std::endl;
  21.     }
  22.    
  23.     void closeConnection() {
  24.         std::cout << "关闭数据库连接..." << std::endl;
  25.     }
  26.    
  27. public:
  28.     // 模板方法 - 定义算法框架
  29.     void process() {
  30.         openConnection();
  31.         
  32.         readData();
  33.         
  34.         if (shouldValidate()) {
  35.             validateData();
  36.         }
  37.         
  38.         processData();
  39.         writeData();
  40.         
  41.         closeConnection();
  42.     }
  43.    
  44.     virtual ~DataProcessor() = default;
  45. };
  46. // ==================== 具体类 ====================
  47. class CsvDataProcessor : public DataProcessor {
  48. protected:
  49.     void readData() override {
  50.         std::cout << "从CSV文件读取数据..." << std::endl;
  51.     }
  52.    
  53.     void processData() override {
  54.         std::cout << "处理CSV数据..." << std::endl;
  55.     }
  56.    
  57.     void writeData() override {
  58.         std::cout << "将处理结果写入CSV文件..." << std::endl;
  59.     }
  60.    
  61.     bool shouldValidate() const override {
  62.         return false; // CSV数据不需要验证
  63.     }
  64. };
  65. class DatabaseDataProcessor : public DataProcessor {
  66. protected:
  67.     void readData() override {
  68.         std::cout << "从数据库读取数据..." << std::endl;
  69.     }
  70.    
  71.     void processData() override {
  72.         std::cout << "处理数据库数据..." << std::endl;
  73.     }
  74.    
  75.     void writeData() override {
  76.         std::cout << "将处理结果写入数据库..." << std::endl;
  77.     }
  78.    
  79.     void validateData() override {
  80.         std::cout << "执行严格的数据验证..." << std::endl;
  81.     }
  82. };
  83. class ApiDataProcessor : public DataProcessor {
  84. protected:
  85.     void readData() override {
  86.         std::cout << "从API获取数据..." << std::endl;
  87.     }
  88.    
  89.     void processData() override {
  90.         std::cout << "处理API数据..." << std::endl;
  91.     }
  92.    
  93.     void writeData() override {
  94.         std::cout << "将处理结果通过API发送..." << std::endl;
  95.     }
  96.    
  97.     bool shouldValidate() const override {
  98.         return true;
  99.     }
  100.    
  101.     void openConnection() { // 覆盖具体方法
  102.         std::cout << "初始化API连接..." << std::endl;
  103.     }
  104.    
  105.     void closeConnection() { // 覆盖具体方法
  106.         std::cout << "终止API连接..." << std::endl;
  107.     }
  108. };
  109. // ==================== 客户端代码 ====================
  110. int main() {
  111.     std::cout << "=== 模板方法模式演示: 数据处理流程 ===" << std::endl;
  112.    
  113.     std::cout << "\n处理CSV数据:" << std::endl;
  114.     CsvDataProcessor csvProcessor;
  115.     csvProcessor.process();
  116.    
  117.     std::cout << "\n处理数据库数据:" << std::endl;
  118.     DatabaseDataProcessor dbProcessor;
  119.     dbProcessor.process();
  120.    
  121.     std::cout << "\n处理API数据:" << std::endl;
  122.     ApiDataProcessor apiProcessor;
  123.     apiProcessor.process();
  124.    
  125.     return 0;
  126. }
复制代码
模式变体

1. 使用钩子方法
  1. class DocumentExporter {
  2. protected:
  3.     virtual void prepareData() = 0;
  4.     virtual void generateFile() = 0;
  5.    
  6.     // 钩子方法 - 可选步骤
  7.     virtual bool shouldCompress() const { return false; }
  8.     virtual void compressFile() {
  9.         std::cout << "使用默认压缩算法压缩文件..." << std::endl;
  10.     }
  11.    
  12. public:
  13.     void exportDocument() {
  14.         prepareData();
  15.         generateFile();
  16.         
  17.         if (shouldCompress()) {
  18.             compressFile();
  19.         }
  20.     }
  21. };
复制代码
2. 模板方法与战略模式结合
  1. // 策略接口
  2. class ValidationStrategy {
  3. public:
  4.     virtual void validate() = 0;
  5.     virtual ~ValidationStrategy() = default;
  6. };
  7. // 模板方法抽象类
  8. class ReportGenerator {
  9.     std::unique_ptr<ValidationStrategy> validationStrategy_;
  10.    
  11. protected:
  12.     virtual void fetchData() = 0;
  13.     virtual void formatReport() = 0;
  14.    
  15.     void validateData() {
  16.         if (validationStrategy_) {
  17.             validationStrategy_->validate();
  18.         }
  19.     }
  20.    
  21. public:
  22.     void setValidationStrategy(std::unique_ptr<ValidationStrategy> strategy) {
  23.         validationStrategy_ = std::move(strategy);
  24.     }
  25.    
  26.     void generate() {
  27.         fetchData();
  28.         validateData();
  29.         formatReport();
  30.     }
  31. };
复制代码
实际应用场景


  •         框架操持:定义算法框架,允许用户自定义部分步调
  •         数据处置惩罚流程:如示例中的数据读取-处置惩罚-写入流程
  •         游戏开发:游戏循环的固定流程
  •         编译器:编译流程中的固定步调
  •         测试框架:测试用例的执行流程

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表