说下对模板模式的理解:
模板模式, 定义一个操作中的算法的骨架, 而将一部分的步骤延时到子类中去。 通过模板方法, 使得子类可以在不改变一个算法结构的情况下, 可以重新定义算法的某些特定步骤。
他将不变的行为搬移到超类中去, 去除了类中的重复代码, 体现出他代码复用的优势。
ie, 当不变的和可变的行为在方法的子类实现中混合在一起的时候, 不变的行为会重复在子类中出现, 这时候, 我们可以考虑使用模板方法模式, 将这些不变的行为搬移到单一的地方去, 由此帮助子类摆脱重复的不变行为的纠缠。
UML 图
运行效果图:
代码:
testPaper.h
#ifndef _TESTPAPER_H_
#define _TESTPAPER_H_
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
/************************************************************************/
/* 试卷模板 */
/************************************************************************/
class CTestPaper{
public:
void showPaper() const{
Start();
TestQuestion1();
TestQuestion2();
TestQuestion3();
Stop();
}
private:
void Start() const {
cout << "========================================================" << endl;
cout << "=== name :\t" << StudentName() <<"\t==========="<< endl;
}
void Stop() const {
cout << "========================================================" << endl;
}
void TestQuestion1() const{
cout << "杨过得到, 后来给了郭靖, 炼成倚天剑,屠龙刀的玄铁可能是【】 a.球墨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维" << endl;
cout << "你的答案是:【" << Answer1() << "】" << endl;
}
void TestQuestion2() const{
cout << "杨过,程英,陆无双铲除了情花, 造成【】a.使这种植物不在害人 b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成该地区沙漠化" << endl;
cout << "你的答案是:【" << Answer2() << "】" << endl;
}
void TestQuestion3() const{
cout << "蓝凤凰只是华山试图, 桃谷六仙呕吐不止, 如果你是大夫, 会给他们开什么药【】 a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他们和大量的生牛奶 e.以上都不对" << endl;
cout << "你的答案是:【" << Answer3() << "】" << endl;
}
virtual string Answer1() const { return ""; }
virtual string Answer2() const { return ""; }
virtual string Answer3() const { return ""; }
virtual string StudentName() const { return ""; }
};
/************************************************************************/
/* 学生1试卷 */
/************************************************************************/
class CStuPaper1 : public CTestPaper{
string Answer1() const override { return "a"; }
string Answer2() const override { return "b"; }
string Answer3() const override { return "c"; }
string StudentName() const override { return "lisi"; }
};
/************************************************************************/
/* 学生2试卷 */
/************************************************************************/
class CStuPaper2 : public CTestPaper{
string Answer1() const override { return "b"; }
string Answer2() const override { return "b"; }
string Answer3() const override { return "c"; }
string StudentName() const override { return "zhangsan"; }
};
#endif // _TESTPAPER_H_
main.cpp
#include "TestPaper.h"
#include <memory>
#include <iostream>
using namespace std;
int main(){
shared_ptr<CTestPaper> paper(new CStuPaper1);
paper->showPaper();
paper = shared_ptr<CTestPaper>(new CStuPaper2);
paper->showPaper();
system("pause");
return EXIT_SUCCESS;
}