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

【设计模式之模板方法模式 -- C++】

模板方法模式 – 抽象父类,子类实现

模板方法设计模式是一种行为设计模式,它在父类中定义了一个操作的算法的骨架,而将一些步骤延迟到子类中实现。这样,可以在不改变算法结构的前提下,重新定义算法的某些特定步骤。模板方法模式是开发中非常常用的模式,主要是一下步骤:

步骤
  1. 定义抽象类(Abstract Class):首先,定义一个抽象基类,它声明了一系列的基本操作(可以是抽象的或具有默认实现的方法),以及一个模板方法。模板方法定义了一个算法的框架,按照某种顺序调用基本操作。

  2. 实现具体步骤:然后,创建具体子类,继承自抽象基类,并实现其基本操作。这些操作的具体实现会影响模板方法中算法的某些部分,但不会改变算法的结构。

  3. 调用模板方法:最后,客户端代码调用模板方法来执行算法。由于算法的结构已经在抽象类中定义,所以客户端不需要知道具体的实现细节。

模板方法模式的关键在于,它利用继承将算法的框架和实际的执行细节分离开来,使得子类可以在不改变算法结构的情况下,通过重定义某些步骤来改变算法的行为。

这种模式特别适用于有固定算法步骤,但各个步骤之间有细微差别的场景。通过模板方法模式,可以将这些步骤的实现延迟到子类中,提高代码的复用性和扩展性。

实现
  1. 抽象父类
class AbstractClass {
public:AbstractClass() {}virtual ~AbstractClass() {}// 模板方法void TemplateMethod() {PrimitiveOperation1();PrimitiveOperation2();}// 基本方法virtual void PrimitiveOperation1() = 0;virtual void PrimitiveOperation2() = 0;
};
  1. 子类实现
class ConcreteClassA : public AbstractClass {
public:ConcreteClassA() {}~ConcreteClassA() {}void PrimitiveOperation1() {cout << "ConcreteClassA PrimitiveOperation1" << endl;}void PrimitiveOperation2() {cout << "ConcreteClassA PrimitiveOperation2" << endl;}
};
  1. 测试
int main() {AbstractClass* p1 = new ConcreteClassA();p1->TemplateMethod();delete p1;return 0;
}
  1. 结果
ConcreteClassA PrimitiveOperation1
ConcreteClassA PrimitiveOperation2

相关文章:

  • 模拟面试三
  • spring-websocket实现(一)
  • TPS、QPS、CPS、PV和UV
  • 『FPGA通信接口』LVDS接口(4)LVDS接收端设计
  • 1095 解码PAT准考证(测试点3)
  • 海外短剧系统如何征服观众心
  • Docker可视化web工具
  • 工业web4.0UI风格令人惊艳
  • YIA主题侧边栏如何添加3D旋转标签云?
  • Spring Boot与Istio服务网格的整合实践
  • Spring Boot集成Minio插件快速入门
  • 「五度易链」企业大数据API接口开放平台上线啦!
  • EE trade:炒伦敦金的注意事项及交易指南
  • 1962springboot VUE社区服务平台系统开发mysql数据库web结构java编程计算机网页源码maven项目
  • VScode创建ROS项目 ROS集成开发环境
  • android图片蒙层
  • codis proxy处理流程
  • CSS3 变换
  • interface和setter,getter
  • javascript从右向左截取指定位数字符的3种方法
  • JAVA之继承和多态
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • MySQL主从复制读写分离及奇怪的问题
  • OSS Web直传 (文件图片)
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 多线程 start 和 run 方法到底有什么区别?
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于HAProxy的高性能缓存服务器nuster
  • 解析带emoji和链接的聊天系统消息
  • 利用jquery编写加法运算验证码
  • 七牛云假注销小指南
  • 区块链共识机制优缺点对比都是什么
  • 如何胜任知名企业的商业数据分析师?
  • 如何学习JavaEE,项目又该如何做?
  • 使用putty远程连接linux
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • ​什么是bug?bug的源头在哪里?
  • #define
  • $(selector).each()和$.each()的区别
  • (笔记自用)LeetCode:快乐数
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (附源码)springboot助农电商系统 毕业设计 081919
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (三)uboot源码分析
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)3D模板阴影原理
  • (转)Oracle存储过程编写经验和优化措施
  • (转)大道至简,职场上做人做事做管理
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting