用C++跟你聊聊“模板方法模式”
时间:2022-07-23
本文章向大家介绍用C++跟你聊聊“模板方法模式”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
从选择题蒙答案聊起
相信大家都是久经沙场的战士,一路摸爬滚打过来的,咱可以说是“革命友谊深厚”吧。我们以前蒙选择题,都是”三短一长选一长“那一套,不知道现在还流行不。
啊,我们今天的主题不是教大家怎么去蒙选择题啊,而是要做一个简易的选择题判题系统。啊,这个和那些流弊的OJ那咱可不敢比啊,选择题就ABCDE四个选项嘛,所以相对会简单的不是一星半点。
那么我们先来搭环境:首先,我们得有一套试卷,然后,我们得发给每个人,每个人只能在它相应的地方填上相应的答案,最后,我们回收回来进行统计。
环境已经很清楚了,我们画成UML类图。可能有的小伙伴会觉得和前面讲过的策略模式有一定的契合度,是有一定的契合度啊,不过“策略模式”的子类自由度更高,而“模板方法模式”的子类自由度相对比较低一些。模板嘛,写死的;策略嘛,调度的。
试卷设计图
模板方法模式:定义一个操作中的算法的骨架,而将一些操作延迟到子类中,模板方法使得子类可以在不改变一个算法的结构而重定义该算法的某些特定步骤。
简易选择题判题系统实现
#include<iostream>
using namespace std;
class exam {
protected:
//一些抽象行为,下放到子类实现
virtual void PrimitiveOperation1() = 0;
virtual void PrimitiveOperation2() = 0;
public:
//模板方法,给出了逻辑的骨架
void TemplateMethon()
{
PrimitiveOperation1();
PrimitiveOperation2();
cout << "作答完毕!" << endl;
}
};
class stuA :public exam{
virtual void PrimitiveOperation1() {
cout << "A" << " "; //具体怎么作答,在上面挂一个switch判断,这里不多说
}
virtual void PrimitiveOperation2() {
cout << "B" << " ";
}
};
class stuB :public exam {
virtual void PrimitiveOperation1() {
cout << "C" << " "; //具体怎么作答,在上面挂一个switch判断,这里不多说
}
virtual void PrimitiveOperation2() {
cout << "D" << " ";
}
};
//如果要做成一个选择题判题系统,可以自己再改造一下,很简单
//如果实在不想自己写,在下面评论滴我
int main()
{
exam* E;
E = new stuA();
E->TemplateMethon();
E = new stuB();
E->TemplateMethon();
return 0;
}
模板方法特点
模板方法就是通过吧不变的行为搬到抽象类中,去除子类中的重复代码,来体现它的优势。 模板方法模式提供了一个很好的代码复用平台。
- 关关的刷题日记11——Leetcode 1. Two Sum 方法2、3
- 计蒜客:百度的科学计算器(简单)【python神解】
- 关关的刷题日记12——Leetcode 189. Rotate Array 方法1、2、3
- 关关的刷题日记13——Leetcode 414. Third Maximum Number
- 关关的刷题日记14——Leetcode 167. Two Sum II - Input array is sorted
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
- 【专知-关关的刷题日记15】Leetcode 27. Remove Element 方法1、2、3
- [接口测试 - 基础篇] 07 来来来,一起读写excel玩玩之一
- 时间序列分析算法【R详解】
- 【专知-关关的刷题日记16】Leetcode 88. Merge Sorted Array
- [接口测试 - 基础篇] 06 好吧也来解析下html
- [接口测试 - 基础篇] 05 好讨厌的xml解析
- 【专知-关关的刷题日记17】Leetcode 268. Missing Number
- 【专知-关关的刷题日记18】Leetcode 35. Search Insert Position
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法