04-模板方法模式-C语言实现

代码实现:

#include <stdio.h>// 定义抽象基类
typedef struct {void (*step1)(void);void (*step2)(void);void (*step3)(void);
} AbstractClass;// 具体实现类1
void concreteStep1() {printf("Concrete Step 1\n");
}void concreteStep2() {printf("Concrete Step 2\n");
}void concreteStep3() {printf("Concrete Step 3\n");
}// 具体实现类2
void anotherConcreteStep1() {printf("Another Concrete Step 1\n");
}void anotherConcreteStep2() {printf("Another Concrete Step 2\n");
}void anotherConcreteStep3() {printf("Another Concrete Step 3\n");
}// 模板方法
void templateMethod(AbstractClass* obj) {obj->step1();obj->step2();obj->step3();
}int main() {// 创建具体实现类1的对象并调用模板方法AbstractClass obj1 = {concreteStep1, concreteStep2, concreteStep3};templateMethod(&obj1);// 创建具体实现类2的对象并调用模板方法AbstractClass obj2 = {anotherConcreteStep1, anotherConcreteStep2, anotherConcreteStep3};templateMethod(&obj2);return 0;
}

在上面的示例代码中,首先定义了一个抽象基类AbstractClass,其中包含了三个函数指针,对应模板方法中的三个步骤。然后定义了具体实现类concreteStep1concreteStep2concreteStep3,以及另一个具体实现类anotherConcreteStep1anotherConcreteStep2anotherConcreteStep3,它们分别实现了抽象基类中的三个步骤。

接下来定义了模板方法templateMethod,它接收一个抽象基类对象作为参数,并依次调用对象的三个函数指针,完成算法的骨架部分。最后,在main函数中创建了两个不同的具体实现类的对象,并调用模板方法进行测试。

模板方法模式将算法的骨架和具体步骤的实现进行了解耦,通过在抽象基类中定义模板方法,并使用函数指针回调具体实现类的函数来实现多态性,可以灵活地扩展和定制算法的具体步骤。

模板方法模式是一种典型的行为型设计模式,其主要优缺点如下:

优点:

  1. 封装不变部分:将算法的骨架和具体实现分离,把不变的部分封装到父类中,可以提高代码复用性和可维护性。
  2. 提高可扩展性:子类可以通过重写父类的钩子方法,来改变算法的某些步骤,从而增强了模板方法的灵活性和可扩展性。
  3. 便于维护:模板方法模式使得算法的各个步骤都有明确的定义,易于调试和维护。

缺点:

  1. 增加了类的数量:为了实现模板方法模式,需要定义抽象类或接口,以及具体实现类,会增加类的数量和层次。
  2. 限制了继承的使用:由于模板方法模式采用了父类调用子类的方式,因此对子类的继承有一定的限制,子类必须遵循父类定义的算法骨架。
  3. 不适合复杂算法:如果算法的步骤太多或者太复杂,可能会导致模板方法变得过于庞大和复杂,难以维护和扩展。

适用场景:

  1. 算法的骨架已经确定,但是某些步骤的具体实现可能不同。
  2. 需要封装一些复杂的流程,使得屏蔽细节,提高代码复用性,以及便于维护。
  3. 具有多个子类共同实现某个方法,并且这些子类中的部分步骤相同,部分步骤不同。

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

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

相关文章

Embedding And Word2vec

Embedding与向量数据库&#xff1a; Embedding 简单地说就是 N 维数字向量&#xff0c;可以代表任何东西&#xff0c;包括文本、音乐、视频等等。要创建一个Embedding有很多方法&#xff0c;可以使用Word2vec&#xff0c;也可以使用OpenAI 的 Ada。创建好的Embedding&#xff…

什么是先验知识和后验知识

在概率论和统计学中&#xff0c;先验知识&#xff08;Prior knowledge&#xff09;和后验知识&#xff08;Posterior knowledge&#xff09;是贝叶斯推断的两个基本概念。 先验知识&#xff08;先验概率&#xff09;&#xff1a; 先验知识指的是在观察到数据之前&#xff0c;关…

【开源】基于JAVA的超市账单管理系统

项目编号&#xff1a; S 032 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S032&#xff0c;文末获取源码。} 项目编号&#xff1a;S032&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3…

Beta冲刺总结随笔

这个作业属于哪个课程软件工程A这个作业要求在哪里beta冲刺事后诸葛亮作业目标Beta冲刺总结随笔团队名称橘色肥猫团队置顶集合随笔链接Beta冲刺笔记-置顶-橘色肥猫-CSDN博客 文章目录 一、Beta冲刺完成情况二、改进计划完成情况2.1 需要改进的团队分工2.2 需要改进的工具流程 三…

js校验多个时间段的时间是否有交叉

参考博客&#xff1a; Java日期时间API系列37-----时间段是否有重叠&#xff08;交集&#xff09;的计算方法 Java 最优雅方式校验时间段重叠 判断是否有交叉数据 let timePeriod [{start: dateList[0].value, //时间段1的开始时间 时间格式为1130&#xff08;代表11&#xf…

基于ASP的购物网站设计

摘 要 随着计算机科学的不断发展和网络的迅速普及&#xff0c;Internet 的应用已经涉及到人们生活的方方面面&#xff0c;越来越多的现代企业也意识到了这一点&#xff0c;如何在当前的网络大发展的背景下开拓市场已经成为了企业关注的重中之重。总的来说&#xff0c;互联网的…

从零开始搭建博客网站-----登陆页面

登录按钮以及背景图设置 安装element-plus和css插件 npm install element-plus --save npm install sass --save npm install sass-loader --save在main.js里引用 寻找背景图存入assets文件下&#xff0c;并且在Login.vue里设置背景图和登录按钮 设置的背景图的大小没有起…

智慧安防三大信息技术:云计算、大数据及人工智能在视频监控EasyCVR中的应用

说到三大信息技术大家都很清楚&#xff0c;指的是云计算、大数据和人工智能&#xff0c;在人工智能&#xff08;AI&#xff09;快速发展的当下&#xff0c;例如常见的大数据分析、人工智能芯片生产的智能机器人等等&#xff0c;在工作、生活、教育、金融、科技、工业、农业、娱…

Unity 与 虚拟机ROS连接

Unity 与 虚拟机ROS连接 知识储备前期准备ROS部分Unity部分 连接测试 知识储备 unity官方教程&#xff1a; https://github.com/Unity-Technologies/Unity-Robotics-HubWin11家庭版开启HyperV&#xff1a; https://zhuanlan.zhihu.com/p/577980646HyperV安装Ubuntu: https://b…

找出数组里最大元素和最小元素

必应出来的一段参考代码&#xff08;ref&#xff1a;How to Use Hypothesis and Pytest for Robust Property-Based Testing in Python | Pytest With Eric&#xff09;&#xff1a; def find_largest_smallest_item(input_array: list) -> tuple: """ Fu…

可视化开源编辑器Swagger Editor本地部署并实现远程访问管理编辑文档

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagge…

【Android面试|华为|广播类】-Local Broaddcasts 能接收到系统广播么?

华为面试官问了其中一个问题 Q: Local Broaddcasts 能接收到系统广播么&#xff1f; A: 本地广播&#xff08;Local Broaddcasts&#xff09; 只在本App发送和接收的广播。注册为本地广播的接收器无法收到标准广播。 Android应用可以通过广播从系统或其他App接收或发送消息。类…

工业机器视觉megauging(向光有光)使用说明书(二,轻量级的visionpro)

测试程序暂时支持80万&#xff08;包含1024*768&#xff09;以上的gige工业相机&#xff0c;以后会支持640*480分辨率相机。 我们程序中使用注意力机制&#xff0c;其实就是感兴趣区域&#xff08;roi&#xff0c;你看过我前面博文&#xff0c;就应该明白&#xff09;精神的延…

如何让企业报修、派单更高效!自动派单系统有什么用?

最近有做学校后勤报修、物业、酒店民宿的朋友找到我&#xff0c;聊得最多的就是关于任务分发的事情&#xff0c;觉得工作任务派单好难&#xff01;   我也从跟他们聊天过程中简单整理了以下两种报修派单中普遍存在的问题&#xff1a;   第一种就是有人打电话报修&#xff0…

FreeRTOS入门

目录 一、什么是任务 二、创建任务---xTaskCreate函数 三、任务的删除 四、任务优先级 1.阻塞状态(Blocked) 2.暂停状态(Suspended) 3.就绪状态(Ready) 五、Delay 六、调度算法 一、什么是任务 在FreeRTOS中&#xff0c;任务就是一个函数&#xff0c;原型如下&#xff…

华为OD机试真题-最大坐标值-2023年OD统一考试(C卷)

题目描述: 小明在玩一个游戏,游戏规则如下: 在游戏开始前,小明站在坐标轴原点处(坐标值为0)。 给定一组指令和一个幸运数,每个指令都是一个整数,小明按照指定的要求前进或者后退指定的步数。前进代表朝坐标轴的正方向走,后退代表朝坐标轴的负方向走。 幸运数为一个整数…

【数据库】MSSQL 注入入门级的讲解

MSSQL 注入是一种常见的网络攻击技术,它通过在应用程序中插入恶意 SQL 代码,从而窃取、修改或破坏数据库中的数据。为了帮助您更好地了解 MSSQL 注入,以下是一个入门级的讲解。 1. 什么是 MSSQL 注入? MSSQL 注入是一种利用应用程序中的 SQL 语句漏洞,通过在输入数据中插入…

保护您的数据库免受注入攻击:MSSQL注入入门指南

MSSQL注入的入门讲解 一、引言二、MSSQL注入的基础知识2.1、MSSQL数据库的基本原理和结构2.2、常见的SQL语句和操作2.3、MSSQL注入的原理和工作方式 三、MSSQL注入攻击技术3.1、基于错误的注入攻击&#xff1a;利用错误消息和异常信息3.2、基于时间的注入攻击&#xff1a;利用延…

shell语法

概论 shell是我们通过命令行与操作系统沟通的语言 shell脚本可以直接在命令行中执行&#xff0c;也可以将一套逻辑组织成一个文件&#xff0c;方便复用。 DA Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。 1.脚本示例 新建一个test.sh文件&#xff0c;内容如…

Ubuntu上传文件到SMB共享文件夹

0. 前言 公司有一些数据共享文件夹&#xff0c;平时可以把开发的重要文件放到上面备份。本人开发使用ubuntu系统&#xff0c;共享文件夹是windows的形式&#xff0c;想通过命令的方式&#xff0c;方便快捷&#xff0c;还可shell脚本自动化。 1. 安装挂载库 sudo apt-get upd…