1.初识模板方法模式
读了这么多年书,大家或多或少都遇到过这样的情况吧:老师在黑板上写了一些题,让学生记下去,然后写答案在交上来。(还记得那个时候我近视看不清黑板的痛苦啊,那个时候我只能别人抄完了,我在照他们抄。)其实这就是模板方法模式能够解决的问题了,分析一下我们便知道大家每个人抄的题应该都是一样的吧,只有答案可能不一样,要是大家抄的选择题,那么不一样的东西就只有一个答案,区别可能就是A,B,C,D。可是每个人却都要抄一遍题,要是遇到一个我这样的近视,还可能把题抄错了。这就体现出来模板方法模式的重要性了,建立一个模板类,类中包括:模板方法和子类实现的方法。这里模板方法为题目+答案(调用类中的答案方法),子类实现的方法就是答案方法,这样做就避免了每个子类总都包含题目,使得每个子类中只需要包含答案。说恐怕怎么说也不直观,还是看看代码实现吧。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.模板方法模式应用举例
看看具体的模板类和具体实现是怎么实现的吧:
- class TestpaperTemplate
- {
- public :
- void templateMethod()//模板方法,定义了要完成操作的骨架
- {
- question1();
- answer1();
- question2();
- answer2();
- };
- void question1()
- {
- cout<<"问题一:二叉树每个节点儿子节点数目有多少:\n";
- cout<<"A.最多1个 B.最多两个 C.任意多个 D.至少一个";
- };
- void question2()
- {
- cout<<"问题二:完全二叉树叶子节点可能在哪一层:\n";
- cout<<"A.任意一层 B.最后一层 C.最后两层 D.最后三层";
- };
- protected:
- virtual void answer1();//这两个方法的具体实现延时到子类,因不同的类而不同
- virtual void answer2();
- };
- class StudentA :public TestpaperTemplate
- {
- virtual void answer1()
- {
- cout<<"答案:B"<<endl<<endl;
- }
- virtual void answer2()
- {
- cout<<"答案:A"<<endl<<endl;
- }
- };
- class StudentB :public TestpaperTemplate
- {
- //此处和StudentA中类似,只是每个学生选择的答案不同
- };
这