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

21 模板方法(Template Method)模式

模板方法模式

1.1 分类

(类)行为型

1.2 提出问题

做一款数据挖掘的程序,需要支持不同格式的数据文件,虽然文件格式不同,实现步骤基本一致。

1.3 解决方案

定义一个算法骨架,而将一些步骤延迟到子类。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

1.4 实现类图

在这里插入图片描述

  1. 抽象类(AbstractClass) 会声明作为算法步骤的方法, 以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现。
  2. 具体类(ConcreteClass)可以重写所有步骤,但不能重写模板方法自身。

1.5 示例代码

#include <iostream>
#include <string>

class DataMiner {
public:
    //template method
    void mineData(std::string path)  {
        openFile(path);
        extractData();
        makeReport();
        hook1();
        closeFile();
    }
protected:
    virtual void openFile(std::string path) = 0;
    void extractData() const {
        std::cout << "DataMiner:从字符串中提取相关数据。\n";
    }
    void makeReport() const {
        std::cout << "DataMiner:生成数据分析报告。\n";
    }
    virtual void closeFile() const = 0;
    virtual void hook1() const {}
protected:
    std::string m_str="";
};

class PDFDataMiner : public DataMiner {
public:
    virtual void openFile(std::string path) {
        m_str = "openfile(path)";
        std::cout << "PDFDataMiner:打开PDF文件,转换为字符串序列。\n";
    }
    virtual void closeFile() const {
        std::cout << "PDFDataMiner:关闭PDF文件。\n";
    }
};

class WordDataMiner : public DataMiner {
public:
    virtual void openFile(std::string path) {
        m_str = "openfile(path)";
        std::cout << "WordDataMiner:打开Word文件,转换为字符串序列。\n";
    }
    virtual void closeFile() const {
        std::cout << "WordDataMiner:关闭Word文件。\n";
    }
    virtual void hook1() const {
        std::cout << "WordDataMiner:给word文件添加水印。\n";
    }
};

void clientCode(DataMiner* dataMiner,std::string path) {
    dataMiner->mineData(path);
}
int main()
{
    PDFDataMiner pdfDataMiner;
    clientCode(&pdfDataMiner, "aa.pdf");

    std::cout << std::endl;
    WordDataMiner wordDataMiner;
    clientCode(&wordDataMiner, "aa.doc");
}

1.6 举个栗子

模板方法模式为一款简单策略游戏中人工智能的不同分支提供“框架”。
在这里插入图片描述

1.7 总结

1.7.1 优点

  1. 仅允许客户端重写一个大型算法中的特定部分,使得算法其他部分修改对其所造成的影响减小。
  2. 可将重复代码提取到一个超类中。

1.7.2 缺点

模板方法中的步骤越多,其维护工作就可能会越困难。

http://www.dtcms.com/a/103254.html

相关文章:

  • Jmeter(性能指标、指标插件、测试问题、面试题、讲解稿)
  • Linux : System V 共享内存
  • 基于srpingboot智慧校园管理服务平台的设计与实现(源码+文档+部署讲解)
  • 基于SpringBoot的“小说阅读平台”的设计与实现(源码+数据库+文档+PPT)
  • 基于springboot+vue的校园数字化图书馆系统
  • 【RAGFlow】ubuntu22部署ragflow(v0.17.2)
  • Cursor 使用 APIkey 配置 Anthropic Claude BaseURL , gpt-4o,deepseek等大模型代理指南
  • 基于单片机的并联均流电源设计(论文+源码)
  • 《C语言:从诞生到成为编程基石的历史之旅》
  • c# 获取redis中所有的value
  • 快速入手-基于DRF跨域配置django-cors-headers(十三)
  • nodejs 文件相关
  • GRU原理
  • 1.1 轴承故障数据预处理与时频图提取
  • 踏过强化学习的每一步推导
  • C++基础算法(插入排序)
  • 学习如何设计大规模系统,为系统设计面试做准备!
  • Uniapp自定义TabBar组件全封装实践与疑难问题解决方案
  • sscanf() 用法详解
  • docker 安装多次 Jenkins后,插件全部报错
  • G8 的 Morph(形态/变形)转移到 Genesis 9 (G9)
  • 《Java八股文の文艺复兴》第八篇:时空裂缝中的锁竞争——当Synchronized与量子纠缠重构线程安全
  • 探索 Gaggol:理解 10^^^100 的宇宙级常数
  • [TAMUctf 2025]
  • 【C语言】文件操作(2)
  • 吾爱破解安卓逆向学习笔记(4p)
  • OpenCV:计算机视觉的强大开源库
  • 【Python Cookbook】字符串和文本(三)
  • Java基础 3.31
  • Macro 巨汇黄金外汇投资全解析:策略与操作步骤?