//模板方法---多个子类,对于某一种流程,处理方法只有细微的差别,此时,可以将不同对象之间相同的处理,集中到其基类中处理,
//而有差别的地方,在子类中进行分别实现。
//定义一个抽象基类,其public接口:首先---实现公共的处理,然后---调用由子类必须实现的虚函数,实现差异化的处理----
//这里需要注意的是,要特别仔细的辨别算法中哪里部分是稳定的,不变的公共部分。否则一旦发现公共部分有些是特殊的,要调整到子类实现中,
//则会牵涉到大量的修改。
//在代码中,利用抽象基类指针动态绑定,可以在不修改客户代码,而实现不同的处理。
//模板方法将稳定的不变的行为搬移到基类,是减少子类代码的重复,还可以定义好算法的框架,而具体的实现延迟到子类中,使得子类不需要改变算法的结构,
//就可以重定义算法的实现步骤。
#include <string>
#include <iostream>
#include <memory>
using namespace std;
//定义抽象基类
class TestPaper
{
public:
void TestQuestion1() //公共接口中实现算法框架----公共处理流程 + 特殊处理(由子类去实现)---将算法的变化放在子类中
{
cout<<"Please write your answer for question 1: A, B, C, D"<<endl;
cout<<"----my answer is : "<<Answer1()<<endl;
}
void TestQuestion2()
{
cout<<"Question 2 have 4 choice, 1,2,3,4, give me your answer!"<<endl;
cout<<"-----my answer is : "<<Answer2()<<endl;
}
protected:
private:
virtual string Answer1() = 0; //定义纯虚函数,子类必须实现相应的操作
virtual string Answer2() = 0;
virtual string Answer3() = 0;
};
//定义子类,进行接口继承,实现有差别的处理。
class TestStudent1 : public TestPaper
{
private:
virtual string Answer1(){ return "A";}
virtual string Answer2(){ return "1";}
virtual string Answer3(){ return "B";}
};
class TestStudent2 : public TestPaper
{
private:
virtual string Answer1(){ return "C";}
virtual string Answer2(){ return "2";}
virtual string Answer3(){ return "xx";}
};
int main()
{
//类的客户代码中,只使用抽象基类的指针(引用),增加了灵活性。
std::tr1::shared_ptr<TestPaper> tp(new TestStudent1());
tp->TestQuestion1();
tp->TestQuestion2();
std::tr1::shared_ptr<TestPaper> tp2(new TestStudent2);
tp2->TestQuestion1();
tp2->TestQuestion2();
return 0;
}