(四)模板方法学习

来源:互联网 发布:初学编程怎么学 编辑:程序博客网 时间:2024/04/20 01:24

//模板方法---多个子类,对于某一种流程,处理方法只有细微的差别,此时,可以将不同对象之间相同的处理,集中到其基类中处理,
//而有差别的地方,在子类中进行分别实现。
//定义一个抽象基类,其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;
}

0 0
原创粉丝点击