文章目录
从选择题蒙答案聊起
相信大家都是久经沙场的战士,一路摸爬滚打过来的,咱可以说是“革命友谊深厚”吧。我们以前蒙选择题,都是”三短一长选一长“那一套,不知道现在还流行不。
啊,我们今天的主题不是教大家怎么去蒙选择题啊,而是要做一个简易的选择题判题系统。啊,这个和那些流弊的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;
}
模板方法特点
模板方法就是通过吧不变的行为搬到抽象类中,去除子类中的重复代码,来体现它的优势。
模板方法模式提供了一个很好的代码复用平台。