2023-7-7-第十三式模板方法模式



🍿*★,°*:.☆( ̄▽ ̄)/$:*.°★* 🍿

💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥
💟💟喜欢的朋友可以关注一下,下次更新不迷路💟💟
😆😆😆私聊获取个人订阅号哦,欢迎订阅共同学习😆😆😆
💖💖💖💖可以加入大家庭群聊,一起学习天天有福利💖💖💖💖





🍬本文摘要

在这里插入图片描述

设计方法二十三式之模板方法模式


目录

  • 🍬本文摘要
  • 😉一、基础概念
  • 🐱‍🐉二、模板方法模式实现
  • 🎉三、模块之间的关系
  • 🐱‍🚀四、注意事项
  • 🎂五、使用场景
  • 🍳参考文献
  • 🧊文章总结



😉一、基础概念

模板方法模式(Template Method Pattern)是一种行为设计模式,它定义了一个操作中的算法骨架,将一些步骤延迟到子类中实现。在模板方法模式中,一个抽象类公开定义了执行它的方法的方式/顺序,而具体的实现则由其子类提供

该模式主要包含以下角色:

  1. 抽象类(Abstract Class):定义了一个模板方法,该方法定义了算法的骨架,其中某些步骤由子类来实现。
  2. 具体类(Concrete Class):实现了抽象类中的抽象方法,完成算法中具体的步骤。

模板方法模式的核心思想是通过将相同的算法步骤封装在父类中,从而避免代码重复,并将可变的部分留给子类进行具体实现。这样可以保证整个算法的一致性和稳定性,同时也能够灵活地扩展和修改特定的步骤。该模式常用于处理一类问题的多个变种情况,以及在框架设计中定义通用的流程控制结构。


🐱‍🐉二、模板方法模式实现

在C++中,模板方法模式可以使用类的继承和虚函数来实现。下面是一个简单的示例:

#include <iostream>// 抽象类
class AbstractClass {
public:// 模板方法void templateMethod() {primitiveOperation1(); // 调用具体的步骤1primitiveOperation2(); // 调用具体的步骤2}protected:// 抽象方法,由子类实现具体步骤1virtual void primitiveOperation1() = 0;// 抽象方法,由子类实现具体步骤2virtual void primitiveOperation2() = 0;
};// 具体类A
class ConcreteClassA : public AbstractClass {
protected:void primitiveOperation1() override {std::cout << "ConcreteClassA: 执行步骤1" << std::endl;}void primitiveOperation2() override {std::cout << "ConcreteClassA: 执行步骤2" << std::endl;}
};// 具体类B
class ConcreteClassB : public AbstractClass {
protected:void primitiveOperation1() override {std::cout << "ConcreteClassB: 执行步骤1" << std::endl;}void primitiveOperation2() override {std::cout << "ConcreteClassB: 执行步骤2" << std::endl;}
};int main() {AbstractClass* objectA = new ConcreteClassA();objectA->templateMethod();AbstractClass* objectB = new ConcreteClassB();objectB->templateMethod();delete objectA;delete objectB;return 0;
}

在上述示例中,AbstractClass 是抽象类,定义了模板方法 templateMethod(),该方法是算法的骨架。它调用了两个纯虚函数 primitiveOperation1()primitiveOperation2(),这些函数由具体类来实现。

ConcreteClassAConcreteClassB 是两个具体类,分别继承了 AbstractClass 并实现了具体步骤。在 main() 函数中创建了两个对象,并调用了它们的模板方法。

输出结果:

ConcreteClassA: 执行步骤1
ConcreteClassA: 执行步骤2
ConcreteClassB: 执行步骤1
ConcreteClassB: 执行步骤2

从输出可以看出,模板方法在不同的具体类中执行了相同的算法骨架,但具体步骤的实现有所区别。这展示了模板方法模式的特点和优势。


🎉三、模块之间的关系

在模板方法模式中,主要涉及两个关键角色:抽象类和具体类。

  1. 抽象类(Abstract Class):抽象类是定义模板方法的地方。它包含了一个或多个抽象方法,这些方法由具体类来实现。抽象类也可以包含一些具体的方法,这些方法在模板方法中被调用,但也可以在具体类中进行重写。

  2. 具体类(Concrete Class):具体类是抽象类的子类,它实现了抽象类中的抽象方法。具体类提供了特定步骤的实现,以完成整个算法。每个具体类都可以有不同的实现方式,但遵循了模板方法定义的算法结构。

模块之间的关系如下:

  • 抽象类作为模板方法的定义者,定义了算法的骨架,其中包含一个或多个抽象方法。抽象类通过调用抽象方法来形成完整的算法流程。
  • 具体类继承抽象类,并实现了抽象方法。具体类负责提供具体步骤的实现,以完成整个算法。每个具体类可以根据自身的需求,提供不同的实现方式。

模板方法模式通过将通用算法骨架放在抽象类中,将可变的具体实现委托给具体类,实现了高内聚、低耦合的设计思想。这种设计模式提供了一种扩展和修改算法的方式,同时保持了整个算法的一致性。


🐱‍🚀四、注意事项

在使用模板方法模式时,有一些注意事项需要考虑:

  1. 设计良好的抽象类:抽象类应该定义一个合理的算法骨架,并确保在模板方法中调用的抽象方法都能被正确实现。抽象类应该提供一个稳定且可靠的模板方法,以免导致子类实现不一致或错误。

  2. 虚函数和纯虚函数的使用:抽象类中的抽象方法可以是虚函数或纯虚函数。使用虚函数允许在抽象类中提供默认的实现,而使用纯虚函数则要求子类必须提供自己的具体实现。

  3. 理解模板方法的作用范围:模板方法只适用于整个算法流程中相对固定的部分。如果某个步骤在不同的情况下具有不同的行为,那么可能需要将其分离成独立的策略模式或其他模式来处理。

  4. 避免过度复杂化的算法:模板方法应该保持简洁和易于理解。如果算法的步骤过多或过于复杂,可能会导致代码难以维护和理解。在这种情况下,考虑重构算法,将一些步骤分解成小块的方法,以提高可读性和可维护性。

  5. 考虑扩展性:模板方法模式应该具备良好的扩展性,使得子类可以轻松添加新的步骤或修改现有步骤。在设计时要留出适当的扩展点,并考虑到可能的变化需求。

总之,使用模板方法模式时要确保抽象类定义了正确的算法骨架,并且具体类实现了正确的步骤。关注代码的可读性、可维护性和扩展性,避免过度复杂化的算法。


🎂五、使用场景

模板方法模式适用于以下场景:

  1. 算法的整体结构相对稳定:如果算法的骨架在不同的实现中是相同的,但其中的某些步骤可能有所不同,那么可以使用模板方法模式。这样可以避免重复编写相同的代码,将公共部分抽象到抽象类中。

  2. 保持算法一致性:模板方法模式确保了算法的一致性,子类只需要实现自己特定的步骤,而无需关心算法的整个流程。这有助于提高代码的可维护性和可读性,并降低出错的风险。

  3. 多个相关类具有共同行为:如果存在多个具有相似行为的类,但其中某些步骤的实现会有所不同,可以使用模板方法模式来避免重复代码。通过在抽象类中定义通用的算法骨架,子类只需提供各自的实现。

  4. 需要增加新的步骤或修改现有步骤:模板方法模式能够方便地扩展或修改算法的步骤。通过添加新的具体类,可以添加新的步骤,或者通过重写已有的步骤来修改算法的行为。

  5. 使用钩子方法进行扩展:抽象类可以提供钩子方法(Hook Method),用于在算法的不同步骤中插入额外的行为。子类可以选择性地重写这些钩子方法,以实现自己的逻辑。

总之,模板方法模式适用于需要定义算法骨架且在具体实现中存在差异的情况。它提供了一种代码复用和扩展的方式,使得整个算法结构更加清晰、可维护和灵活。常见的应用场景包括框架设计、算法封装和工作流程管理等。


🍳参考文献

🧊文章总结

提示:这里对文章进行总结:

   本文讲了关于模板方法模式的知识。






更多好文推荐

🍸2021-4月Python 机器学习——中文新闻文本标题分类
🍹2021年4月-(计算机网络)小型校园网络模拟搭建,最全最准确版
🍺2022-10-31-基于用户的协同过滤推荐算法实现+MAE+RMSE
🍻2022-11-28-大数据可视化,特征维度大于50
🥂2023-3-9-一篇简短的文章把C++左右值关系讲的透透彻彻

上一篇
End
下一篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/19609.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫哪个库用的最多

目录 常用的python爬虫库有哪些 1. Requests&#xff1a; 2. BeautifulSoup&#xff1a; 3. Scrapy&#xff1a; 4. Selenium&#xff1a; 5. Scrapy-Redis&#xff1a; 哪个爬虫库用的最多 Scrapy示例代码 总结 常用的python爬虫库有哪些 Python拥有许多常用的爬虫库…

Idea配置Maven优先从本地仓库获取依赖

idea配置maven依赖优先从指定本地仓库获取 在设置中搜索 Runner ,在VM Option中设置参数-DarchetypeCataloginternal <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http…

在VSCODE编辑器是用ctrl+c和ctrl+s(复制粘贴)失效怎么办

有时我们在开发过程中&#xff0c;由于使用vsccode太长时间导致复制ctrlc和ctrls会失效&#xff0c;之前我的处理方式是重启浏览器&#xff0c;但有时候这样太耗时间了&#xff0c;但发现一个方法可以解决&#xff0c;就是刷新下编辑器的timeline就行&#xff0c;如下图&#x…

安装Ceph集群

安装Ceph集群 环境准备 CentOS 7.6 主机名IPRoleadmin192.168.182.128adminnode1192.168.182.129mon/mgr/osdnode2192.168.182.130osdnode3192.168.182.131osdclient192.168.182.132 所有节点修改主机名相互解析三台node节点添加大小5G以上硬盘关闭所有节点防火墙与SeLinux所…

stringstream的使用

写到290题使用stringstream简化步骤&#xff0c;学习一下使用 目录 小问题&#xff1f; 成员函数clear() 那么问题来了&#xff1f;clear在啥时候用呢&#xff1f; 数据类型转换 <sstream>库定义了三种类&#xff1a;istringstream、ostringstream、stringstream &l…

SpringBoot 项目使用 Elasticsearch 对 Word、Pdf 等文档内容的检索

本文参考自&#xff1a;https://blog.csdn.net/Q54665642ljf/article/details/127701719 本文适用于elasticsearch入门小白&#xff0c;还请大佬能指出我的不足&#xff08;本人其实也是刚学elasticsearch没多久&#xff09; 文章目录 一、准备工作1.1 安装ES文本抽取插件1.2 …

从网络安全行业人才需求讲讲【个人规划】

如果你是一名正在找工作的网络安全方向大学生&#xff0c;或者是刚刚踏入网络安全领域的新手&#xff0c;这篇文章很适合你&#xff0c;如果你是一名老网安人&#xff0c;看看有哪些你中招了。 当你打开BOSS直聘、拉钩等招聘类网站后&#xff0c;在首页的快速导航页面很难找到关…

请求响应-响应-案例

案例需求 加载并解析emp.xml文件中的数据&#xff0c;完成数据处理&#xff0c;并在页面展示 emp.xml文件代码如下&#xff1a; <?xml version"1.0" encoding"UTF-8" ?> <emps><emp><name>金毛狮王</name><age>5…

Centos和redhat桥接模式下固定第二个ip地址为可查

这里我们以centos为例子&#xff0c;redhat与其同理 第一步&#xff1a;进入到镜像network-scripts/目录下 cd /etc/sysconfig/network-scripts 第二步&#xff1a; 输入ls查看自己启用的网卡名字并进行编辑&#xff0c;一般centos默认使用的网卡是idcfg-ens33 第三步&…

【Linux】分布式监控 Zabbix

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Zabbix 介绍zabbix 概述Zabbix 监控原理Zabbix 6.0 新特性Zabbix 6.0 功能组件 Zabbix 6.0 部署Zabbix 添加客户端主机Zabbix 自定义监控内容Zabbix 自动发现与自动…

【深度学习】日常笔记10

loss_fn nn.MSELoss(reductionnone)这行代码&#xff0c;在这个上下文中&#xff0c;loss_fn实际上是一个损失函数对象而不是返回的具体值。 使用nn.MSELoss(reductionnone)创建的loss_fn是一个均方误差损失函数对象&#xff0c;而不是计算后的结果。要计算具体的损失值&…

系统升级丨让VR全景制作简单再简单

最高端的VR全景 往往只需要最朴素的制作方式 酷雷曼3D VR数字化升级平台4.0版本 闪耀上线 全新的后台界面 丝滑的编辑工具 无需代码 不用建模 简单拖拉拽移 依然有手就行 轻松搭建VR元宇宙空间 1、界面升级&#xff0c;让VR创作更加可视 全新视觉设计 酷雷曼3D VR…