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

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

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

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

1 模板方法

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

2 实例

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

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

2.1 版本一:单独的试卷类

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

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

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

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

2.2.2 两个同学分别作答

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

// 学生甲抄的试卷
class TestPaperA : public TestPaper
{
public:// 试题1void TestQuestion1(){TestPaper::TestQuestion1();printf("答案: B\n");}    // 试题2void TestQuestion2(){TestPaper::TestQuestion2();printf("答案: D\n");}    // 试题3void TestQuestion3(){TestPaper::TestQuestion3();printf("答案: B\n");}    
};// 学生乙抄的试卷
class TestPaperB : public TestPaper
{
public:// 试题1void TestQuestion1(){TestPaper::TestQuestion1();printf("答案: B\n");}    // 试题2void TestQuestion2(){TestPaper::TestQuestion2();printf("答案: B\n");}    // 试题3void 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:// 试题1void TestQuestion1(){printf("1.在TCP/IP协议栈中,应用层协议数据单元为(). A.消息 B.段 C.用户数据报 D.帧\n");printf("答案: %s\n", Answer1().c_str());}    // 试题2void TestQuestion2(){printf("2.在C语言中,char型数据在内存中的存储形式是(). A.补码 B.反码 C.原码 D.ASCII码\n");printf("答案: %s\n", Answer2().c_str());}    // 试题3void 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:// 试题1std::string Answer1() {return "B";};  // 试题2std::string Answer2() {return "D";};    // 试题3std::string Answer3() {return "B";};     
};// 学生乙抄的试卷
class TestPaperB : public TestPaper
{
protected:// 试题1std::string Answer1() {return "B";};  // 试题2std::string Answer2() {return "B";};    // 试题3std::string Answer3() {return "C";};    
};

2.3.3 主函数

主函数不用改。

代码运行效果如下:

总结

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


http://www.mrgr.cn/news/53769.html

相关文章:

  • Win安装Redis
  • Python | Leetcode Python题解之第493题翻转对
  • [笔记] 关于CreateProcessWithLogonW函数创建进程
  • unity学习笔记-安装与部署
  • 在wpf 中 用mvvm 的方式 绑定 鼠标事件
  • 监控易监测对象及指标之:Kafka中间件JMX监控指标解读
  • 2024 复健记
  • C++左值和右值
  • csdn(最新交流群)
  • 本机运行Nacos容器每次都要重新创建容器,该怎么办?
  • Mockito单元测试的坑
  • 【Canvas与艺术】八瓣点心包裹之一
  • 【工具变量】A股上市企业大数据应用(2001-2023年)-参考柏淑嫄实践
  • 数据结构_day3
  • 【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第四十五章 注册字符类设备
  • MySQL安装配置教程,入门学习攻略,重点知识点总结
  • 文字的力量
  • JAVA学习-练习试用Java实现“成绩归类”
  • 2024年十大优秀内部风险管理解决方案
  • 软考(网工)——Linux服务器配置
  • Redis 事务 主从复制
  • PRCV 2024 - Day 1
  • 大模型~合集12
  • 深入学习JPEG压缩原理与过程
  • 必看干货|等保测评(网络安全等级保护)五问五答
  • Java:数据结构-二叉树