模板方法模式的C++实现示例

ops/2025/3/15 1:13:33/

核心思想

模板方法设计模式是一种行为设计模式,它定义了一个算法的框架,并将某些步骤的具体实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。

模板方法模式的核心在于:
​1、定义一个算法的骨架:在父类中定义一个模板方法,该方法包含算法的步骤。
​2、延迟实现:将某些步骤的具体实现交给子类来完成。

使用场景

​固定流程,可变实现:当算法的整体流程是固定的,但某些步骤的具体实现可能不同时。
​代码复用:当多个类有相似的算法结构,但某些步骤的实现不同时,可以通过模板方法模式避免代码重复。
​框架设计:在框架设计中,模板方法模式常用于定义框架的核心流程,同时允许用户自定义某些步骤。

优点

​代码复用:将公共的算法逻辑放在父类中,避免重复代码。
​扩展性:子类可以灵活地重写某些步骤,而不影响算法的整体结构。
​控制流程:父类控制算法的流程,子类只负责实现细节。

缺点

​灵活性受限:由于算法的流程是固定的,子类只能改变某些步骤的实现,不能改变整体流程。
​继承的缺点:模板方法模式依赖于继承,如果子类过多,可能会导致类层次结构复杂。

示例代码

#include <iostream>
#include <string>// 抽象基类:定义模板方法
class DocumentProcessor {
public:// 模板方法:定义算法的骨架void processDocument() {openDocument();readDocument();if (needAnalyze()) {analyzeDocument();}saveDocument();closeDocument();}virtual ~DocumentProcessor() = default;protected:// 具体步骤的默认实现virtual void openDocument() {std::cout << "Opening document..." << std::endl;}virtual void readDocument() {std::cout << "Reading document..." << std::endl;}virtual void analyzeDocument() {std::cout << "Analyzing document..." << std::endl;}virtual void saveDocument() {std::cout << "Saving document..." << std::endl;}virtual void closeDocument() {std::cout << "Closing document..." << std::endl;}// 钩子方法:子类可以重写以改变算法的行为virtual bool needAnalyze() {return true;}
};// 具体子类:实现特定类型的文档处理
class PDFProcessor : public DocumentProcessor {
protected:void openDocument() override {std::cout << "Opening PDF document..." << std::endl;}void saveDocument() override {std::cout << "Saving PDF document..." << std::endl;}bool needAnalyze() override {return false;  // PDF 文档不需要分析}
};// 具体子类:实现另一种类型的文档处理
class WordProcessor : public DocumentProcessor {
protected:void openDocument() override {std::cout << "Opening Word document..." << std::endl;}void analyzeDocument() override {std::cout << "Analyzing Word document for spelling errors..." << std::endl;}void saveDocument() override {std::cout << "Saving Word document..." << std::endl;}
};int main() {// 处理 PDF 文档DocumentProcessor* pdfProcessor = new PDFProcessor();pdfProcessor->processDocument();delete pdfProcessor;std::cout << "------------------------" << std::endl;// 处理 Word 文档DocumentProcessor* wordProcessor = new WordProcessor();wordProcessor->processDocument();delete wordProcessor;return 0;
}

输出结果

Opening PDF document...
Reading document...
Saving PDF document...
Closing document...
------------------------
Opening Word document...
Reading document...
Analyzing Word document for spelling errors...
Saving Word document...
Closing document...

代码解析

DocumentProcessor 类
定义了模板方法 processDocument(),它包含了文档处理的固定流程。
提供了默认的步骤实现(如 openDocument()、readDocument() 等)。
提供了一个钩子方法 needAnalyze(),子类可以重写以改变算法的行为。
PDFProcessor 和 WordProcessor 类
继承自 DocumentProcessor,重写了某些步骤的具体实现。
PDFProcessor 禁用了分析步骤,而 WordProcessor 提供了特定的分析逻辑。
main 函数
分别使用 PDFProcessor 和 WordProcessor 处理文档,展示了模板方法模式的灵活性。


http://www.ppmy.cn/ops/165810.html

相关文章

Ae 效果详解:VR 颜色渐变

Ae菜单&#xff1a;效果/沉浸式视频/VR 颜色渐变 Immersive Video/VR Color Gradients VR 颜色渐变 VR Color Gradients效果用于在 VR 素材上应用可自定义的颜色渐变&#xff0c;以增强视觉风格或创建特效。适用于天空背景着色、滤镜效果、氛围增强等场景。 本效果适用于所有色…

Spring Boot面试问答

1. Spring Boot 基础知识 问题 1:什么是Spring Boot?它与Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一个开源框架,旨在简化新Spring应用的初始化和开发过程。与传统的Spring框架相比,Spring Boot提供了以下优势: 自动配置:根据项目依赖自动配置Spring…

【MySQL】MySQL服务器——mysqld

1.MySQL服务器 是名为 mysqld 的数据库服务器程序&#xff0c;和“主机”&#xff08;host&#xff09;不一样是一个多线程的单进程管理对磁盘和内存中数据库的访问支持并发的客户端连接支持多个存储引擎&#xff0c;常见的存储引擎包括InnoDB、MyISAM、Memory、Archive支持事…

转和git subtree管理方式为git submodule的管理方式

将 Git 子树&#xff08;subtree&#xff09;转换为子模块&#xff08;submodule&#xff09;的步骤如下&#xff1a; 1. 确定子树的路径和对应的远程仓库地址 找到当前项目中子树的路径以及对应的远程仓库地址。例如&#xff0c;假设子树的路径为 subtree-folder&#xff0c…

Unity | 工具类:消息管理器-延迟分发

目录 一、消息管理器 二、获得新装备 三、UI面板创建 消息管理器除了简单的订阅(Subscribe)、取消订阅(Unsubscribe)操作以外&#xff0c;还需处理延迟分发(Dispatch)的情况。 &#xff08;即时处理可参考&#xff1a;Unity | 工具类-利用事件系统进行业务串通-CSDN博客&…

基于Spring Cloud Alibaba的电商系统微服务化实战:从拆分到高可用部署

一、系统架构设计与技术选型 1.1 电商系统拆分方案 将单体电商系统拆分为以下核心服务模块: 用户服务:负责用户注册、登录、权限管理 商品服务:管理商品信息、库存、分类 订单服务:处理订单创建、支付、状态流转 支付服务:对接第三方支付平台 网关服务:统一入口,路由与…

PHPCMS V9 登录加密改造

要改造 phpcms 的后台登录&#xff0c;使其前端使用加密方式提交&#xff0c;后端解密&#xff0c;你可以采用 RSA 非对称加密 或 AES 对称加密 方式来增强安全性。 方案设计 前端加密 生成公私钥对&#xff08;推荐使用 RSA&#xff09;。前端使用公钥加密密码&#xff0c;然…

Pytorch中矩阵乘法使用及案例

六种矩阵乘法 torch中包含许多矩阵乘法&#xff0c;大致可以分为以下几种&#xff1a; *&#xff1a;即a * b 按位相乘&#xff0c;要求a和b的形状必须一致&#xff0c;支持广播操作 torch.matmul()&#xff1a;最广泛的矩阵乘法 &#xff1a;与torch.matmul()效果一样&…