模板方法模式:当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其中个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式处理!
其定义是:定义一个c操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤!
下面使用考试回答一个试卷的答案作为例子进行示例:
#ifndef TESTPAPER
#define TESTPAPER
#include <QString>
#include <QtDebug>
class TestPaper
{
public:
TestPaper(){}
void question1()
{
qDebug()<<"第一题"<<"答案"<<Answer1();
}
void question2()
{
qDebug()<<"第一题"<<"答案"<<Answer2();
}
virtual ~TestPaper(){}
protected:
QString virtual Answer1()=0;
QString virtual Answer2()=0;
};
class TestPaper1 final:public TestPaper
{
public:
QString Answer1() override
{
return "A";
}
QString Answer2() override
{
return "B";
}
};
class TestPaper2:public TestPaper
{
public:
QString Answer1() override
{
return "C";
}
QString Answer2() override
{
return "D";
}
};
#endif // TESTPAPER
#include "testpaper.h"
int main(int argc, char *argv[])
{
TestPaper *a = new TestPaper1();
a->question1();
a->question2();
delete a;
a = new TestPaper2();
a->question1();
a->question2();
return 0;
}
有代码可以看出,做试卷的时候每个题目都是一样的,唯一的区别是每个人的答案不同,这样就可以把题目抽象成一个基类,将题目的答案作为虚函数返回,这样子类就可以得到不同的结果而重新实现这些答案的虚函数,非常巧妙!
最后放上源码地址:https://github.com/Dongzhixiao/designMode_qt/tree/master/copyQuestion_template_method_pattern_10