大话设计模式解读07-模板方法

上篇文章,介绍了《大话设计模式》的第9章——原型模式。

本篇,来介绍《大话设计模式》的第10章——模板方法。并通过C++代码实现实例代码的功能。

1 模板方法

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

2 实例

背景:书中小故事,抄题目做题,看不清黑板,题目抄错,导致做题肯定是错的。

题目:用代码的形式来实现。

2.1 版本一:单独的试卷类

版本一的实现比较简单,学生甲和学生乙单独抄试卷做题,分别实现两个类。

2.1.1 两个同学分别抄题目作答

定义两个类,实现两个同学独自抄题做题:

// 学生甲抄的试卷
class TestPaperA
{
public:
    // 试题1
    void TestQuestion1()
    {
        printf("1.在TCP/IP协议栈中,应用层协议数据单元为(). A.消息 B.段 C.用户数据报 D.帧\n");
        printf("答案: B\n");
    }    
    
    // 试题2
    void TestQuestion2()
    {
        printf("2.在C语言中,char型数据在内存中的存储形式是(). A.补码 B.反码 C.原码 D.ASCII码\n");
        printf("答案: D\n");
    }    
    
    // 试题3
    void TestQuestion3()
    {
        printf("3.某计算机字长是32位,存储容量是256KB, 按字编址的寻址范围是(). A.128K B.64K C.32K D.16K\n");
        printf("答案: B\n");
    }    
};

// 学生乙抄的试卷
class TestPaperB
{
public:
    // 试题1
    void TestQuestion1()
    {
        printf("1.在TCP/IP协议栈中,应用层协议数据单元为(). A.消息 B.段 C.用户数据报 D.帧\n");
        printf("答案: B\n");
    }    
    
    // 试题2
    void TestQuestion2()
    {
        printf("2.在C语言中,char型数据在内存中的存储形式是(). A.补码 B.反码 C.原码 D.ASCII码\n");
        printf("答案: B\n");
    }    
    
    // 试题3
    void TestQuestion3()
    {
        printf("3.某计算机字长是32位,存储容量是256KB, 按字编址的寻址范围是(). A.128K B.64K C.32K D.16K\n");
        printf("答案: C\n");
    }    
};

2.1.2 主函数

首先,实例化两个同学,抄题做题,

然后,就可以调用展示接口来显示出来了。

int main()
{
    printf("学生甲抄的试卷:\n");
    TestPaperA studentA;
    studentA.TestQuestion1();
    studentA.TestQuestion2();
    studentA.TestQuestion3();
	
	printf("\n学生乙抄的试卷:\n");
    TestPaperB studentB;
    studentB.TestQuestion1();
    studentB.TestQuestion2();
    studentB.TestQuestion3();
    
    return 0;
}

代码运行效果如下:

下面来看版本二。

2.2 版本二:对试卷题目封装为一个类

版本二,是将题目封装为一个类,这样就确保两个同学做的题目是一样的:

2.2.1 试题类

// 计算机试题
class TestPaper
{
public:
    // 试题1
    void TestQuestion1()
    {
        printf("1.在TCP/IP协议栈中,应用层协议数据单元为(). A.消息 B.段 C.用户数据报 D.帧\n");
    }    
    
    // 试题2
    void TestQuestion2()
    {
        printf("2.在C语言中,char型数据在内存中的存储形式是(). A.补码 B.反码 C.原码 D.ASCII码\n");
    }    
    
    // 试题3
    void TestQuestion3()
    {
        printf("3.某计算机字长是32位,存储容量是256KB, 按字编址的寻址范围是(). A.128K B.64K C.32K D.16K\n");
    }    
};

2.2.2 两个同学分别作答

定义的两个同学类,继承题目类,然后仅根据题目作答即可。

// 学生甲抄的试卷
class TestPaperA : public TestPaper
{
public:
    // 试题1
    void TestQuestion1()
    {
        TestPaper::TestQuestion1();
        printf("答案: B\n");
    }    
    
    // 试题2
    void TestQuestion2()
    {
        TestPaper::TestQuestion2();
        printf("答案: D\n");
    }    
    
    // 试题3
    void TestQuestion3()
    {
        TestPaper::TestQuestion3();
        printf("答案: B\n");
    }    
};

// 学生乙抄的试卷
class TestPaperB : public TestPaper
{
public:
    // 试题1
    void TestQuestion1()
    {
        TestPaper::TestQuestion1();
        printf("答案: B\n");
    }    
    
    // 试题2
    void TestQuestion2()
    {
        TestPaper::TestQuestion2();
        printf("答案: B\n");
    }    
    
    // 试题3
    void TestQuestion3()
    {
        TestPaper::TestQuestion3();
        printf("答案: C\n");
    }    
};

2.2.3 主函数

主函数不用改。

代码运行效果如下:

2.3 版本三:模板方法模式

版本三,模板方法模式。在版本二中,每个同学的类中,还需要有重复的printf(“答案: X\n”);这类代码,实际上,每个同学作答不一样的地方,只是ABCD的这4个选项。

因此,可以将重复的printf也提升到试卷类中,并对ABCD的这4个选项的选择提供一个虚方法,在运行时由子类(同学类)来实现:

2.3.1 试题类

// 计算机试题
class TestPaper
{
public:
    // 试题1
    void TestQuestion1()
    {
        printf("1.在TCP/IP协议栈中,应用层协议数据单元为(). A.消息 B.段 C.用户数据报 D.帧\n");
        printf("答案: %s\n", Answer1().c_str());
    }    
    
    // 试题2
    void TestQuestion2()
    {
        printf("2.在C语言中,char型数据在内存中的存储形式是(). A.补码 B.反码 C.原码 D.ASCII码\n");
        printf("答案: %s\n", Answer2().c_str());
    }    
    
    // 试题3
    void TestQuestion3()
    {
        printf("3.某计算机字长是32位,存储容量是256KB, 按字编址的寻址范围是(). A.128K B.64K C.32K D.16K\n");
        printf("答案: %s\n", Answer3().c_str());
    }  
    
protected: 
    virtual std::string Answer1() {return "";};
    virtual std::string Answer2() {return "";};
    virtual std::string Answer3() {return "";};
};

2.3.2 两个同学分别作答

// 学生甲抄的试卷
class TestPaperA : public TestPaper
{
protected:
    // 试题1
    std::string Answer1() {return "B";};  
    
    // 试题2
    std::string Answer2() {return "D";};    
    
    // 试题3
    std::string Answer3() {return "B";};     
};

// 学生乙抄的试卷
class TestPaperB : public TestPaper
{
protected:
    // 试题1
    std::string Answer1() {return "B";};  
    
    // 试题2
    std::string Answer2() {return "B";};    
    
    // 试题3
    std::string Answer3() {return "C";};    
};

2.3.3 主函数

主函数不用改。

代码运行效果如下:

总结

本篇介绍了设计模式中的模板方法模式,并通过学生抄写题目作答的实例,使用C++编程,来演示模板方法模式的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【简单版】通过 Window.performance 实现前端页面(性能)监控

1 背景 前端监控系统告警xx接口fetchError 问题:前端监控系统没有更多的错误信息,查询该fetch请求对应的接口日志返回200状态码、无请求异常记录,且后台能查到通过该fetch请求成功发送的数据。那是前端页面的错误还是前端监控系统的问题&…

如何轻松使用pip安装Git仓库中的私有Python模块(使用pip和Git仓库发布和安装私有Python模块)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 Git模块 📒📝 Git仓库要求🔖 项目目录结构🔖 文件说明📝 编写setup.py📝 配置MANIFEST.in📝 推送代码到Git仓库📝 使用pip安装模块🔖 使用用户名和密码🔖 使用Personal Access Token (PAT)🔖 示例📝 更…

基于SpringBoot的在线数据平台设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Apache Lucene 10 已发布!Lucene 硬件效率改进及其他改进

作者:来自 Elastic Adrien Grand Apache Lucene 10 刚刚发布,重点关注硬件效率!查看主要版本亮点。 Apache Lucene 10 终于发布了!自 Lucene 9.0(于 2021 年 12 月发布,距今已有近 3 年)以来&a…

Faster RCNN

经过R-CNN和Fast RCNN的积淀,Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster RCNN已经将特征抽取(feature extraction),proposal提取,bounding box regression(rect refine),classificati…

医疗领域的RAG技术:如何通过知识图谱提升准确性

在医学领域,准确的信息检索和处理至关重要。随着大型语言模型(LLMs)的兴起,检索增强生成(RAG)技术在医学信息处理中的应用越来越受到关注。本文将探讨RAG技术在医学领域的应用,特别是如何利用知…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…

潮流头像社 1.1 | 打造个性化专属头像的设计工具。

潮流头像社提供了丰富多样的头像制作工具和素材,让用户可以尽情地展示自己的独特魅力。无论是想要换脸特效、滤镜、贴纸、文字还是配饰,用户都可以在这里找到自己喜欢的元素,并且将其融合到自己的头像设计中,创造出一个独一无二的…

87. 多边形轮廓Shape(圆弧)

先掌握上节课关于Shape内容,再继续学习本节课关于Shape圆弧的介绍。 圆弧方法.arc() 圆弧方法.arc()使用方式和原来学习过的圆弧曲线ArcCurve整体相似,区别在于圆心定位方式有差异。 圆弧.arc()参数的圆心坐标是相对当前.currentPoint而言,而不是坐标原…

MFC工控项目实例二十五多媒体定时计时器

承接专栏《MFC工控项目实例二十四模拟量校正值输入》 用多媒体定时器实现0.1秒计时器 1、在SEAL_PRESSUREDlg.h文件中添加代码 #include<MMSystem.h> #pragma comment(lib,"winmm.lib")class CSEAL_PRESSUREDlg : public CDialog { public:CSEAL_PRESSUREDlg(…

【动态规划】【斐波那契数列模型】三步问题、第N个泰波那契数、使用最小花费爬楼梯

模板 算法原理 做动态规划的题目&#xff0c;一般会先创建一个一维数组 dp&#xff0c;称之为 dp表我们想办法填满这个 dp表&#xff0c;里面的某个值就是最终结果 采用动态规划&#xff0c;一般分五步&#xff1a; 状态表示 是什么&#xff1f; dp 表中每一个值所表示的含义…

王爽汇编语言第三版实验3

实验任务 将下面的程序保存为t1.asm&#xff0c;将其生成可执行文件t1.exe 用Vscode编写源程序t1.asm 用脚本一键生成可执行文件t1.exe 成功运行 查看资源管理器&#xff0c;成功生成T1.obj与t1.exe文件‘ 用debug跟踪t1.exe的执行过程&#xff0c;写出每一步执行后&#xff…

基于SSM的大学校医院信息管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着高校规模的不断扩大和师生健康意识的增强&#xff0c;大学校医院面临着日益增长的医疗服务需求。传统的纸质病历、手工预约和药品管理方式已难以满足高效、准确和便捷的服务要求。因此&#xff0c;开发一套基于SSM&#xff…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

[计算机网络]第一周

TCP/IP 与OSI TCP/IP TCP/IP 四层模型是一个分层网络通信模型&#xff0c;它将网络通信过程分为四个层次&#xff0c;这四层分别是&#xff1a;网络接口层、互联网层、传输层和应用层。 网络接口层负责在计算机和网络硬件之间传输数据&#xff0c;负责在物理网络上发送和接收…

Cesium 影像加载的TileReplacementQueue技术

本文以分析QuadtreePrimitive及相关影像内容&#xff0c;讨论一些流程和方法。影像和地形是Cesium的基础内容&#xff0c;但是有时候感觉这部分的加载和渲染效率并不高。 TileReplacementQueue是一个非常神奇的类&#xff0c;我自己研究了小半天。虽然结构简单&#xff0c;但是…

鸿蒙HarmonyOS开发:应用权限的基本概念及如何申请应用权限详细介绍

文章目录 一、访问控制二、应用权限1、应用权限管控2、权限使用的基本原则3、授权方式4、权限等级 三、申请应用权限1、选择申请权限的方式2、声明权限3、声明样例4、二次向用户申请授权5、具体实现示例6、效果展示 四、应用权限列表1、system_grant&#xff08;系统授权&#…

【开源免费】基于SpringBoot+Vue.JS社区团购系统(JAVA毕业设计)

本文项目编号 T 024 &#xff0c;文末自助获取源码 \color{red}{T024&#xff0c;文末自助获取源码} T024&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…

亿发工单,拯救制造企业的时间:工单也能这样高效

在制造企业的日常生产中&#xff0c;工单管理是一项至关重要的任务。它不仅直接关系到生产效率&#xff0c;还影响到整个生产链的运作。然而&#xff0c;许多制造企业在工单处理过程中面临效率低下、沟通不畅、任务分配混乱等诸多问题&#xff0c;这不仅拖慢了生产进度&#xf…

2024年软件设计师中级(软考中级)详细笔记【7】面向对象技术(下)23种设计模式(分值10+)

目录 前言阅读前必看 第七章 面向对象技术&#xff08;下&#xff09;7.3 设计模式&#xff08;固定4分&#xff09;7.3.1 设计模式的要素7.3.2 创建型设计模式7.3.2.1 Abstract Factory&#xff08;抽象工厂&#xff09;7.3.2.2 Builder&#xff08;生成器&#xff09;7.3.2.3…