设计原则:确保对试卷(父类)的最大复用;将所有重复的代码上升到父类中,而不是让每个子类去重复;
当我们要完成某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们考虑用模板方法模式来处理;
模板模式:定义了一个操作中算法的框架,而将一些步骤延迟到子类;
模板方法使得子类可以不改变一个算法的结构即可重写该算法某些特定的步骤;
模板模式的UML类图:
模板模式优势:把不变形为搬移到父类,去除子类中重复的代码,它提供了一个很好地代码复用平台;
“抄试卷”这一逻辑的模板模式应用:
抽象父类及其子类的定义与实现:testpapaer.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
class TestPaper
{
public:
TestPaper(){TestQuestion1();TestQuestion2();TestQuestion3();}
void TestQuestion1(){cout << "Question1" << endl;}
void TestQuestion2(){cout << "Question2" << endl;}
void TestQuestion3(){cout << "Question3" << endl;}
void PrintAnswer()
{
cout << "answer1 = " << Answer1() << endl;
cout << "answer2 = " << Answer2() << endl;
cout << "answer3 = " << Answer3() << endl;
}
//虚方法实现多态,让继承的子类来重写虚方法;
//一些抽象行为,放到子类中去实现
//模板方法,给出了逻辑的框架,而逻辑的组成是一些相应的抽象操作,它们推迟到子类中去实现
virtual string Answer1()=0;
virtual string Answer2()=0;
virtual string Answer3()=0;
};
class TestPaper1:public TestPaper
{
public:
string Answer1(){return "a";}
string Answer2(){return "b";}
string Answer3(){return "c";}
};
class TestPaper2:public TestPaper
{
public:
string Answer1(){return "b";}
string Answer2(){return "a";}
string Answer3(){return "d";}
};
客户端代码:
#include "testpaper.h"
int main()
{
cout << "TestPaper1:" << endl;
TestPaper *t1=new TestPaper1();//将父类对象的指针指向子类的实现,利用了多态,实现了代码的复用
t1->Answer1();
t1->Answer2();
t1->Answer3();
t1->PrintAnswer();
cout << "TestPaper2:" << endl;
TestPaper *t2=new TestPaper2();
t2->Answer1();
t2->Answer2();
t2->Answer3();
t2->PrintAnswer();
delete t1;
delete t2;
return 0;
}
代码输出为: