提到“模板”不知道别人想到的是什么,我想到的是可复用,与此提供同时可复用又是面向对象编程和设计模式要达到的目的。所以模板方法模式作为一种设计模式也自然是理所应当的啦。其实,模板方法模式是一种比较简单的设计模式,看看具体的吧:
1.初识模板方法模式
读了这么多年书,大家或多或少都遇到过这样的情况吧:老师在黑板上写了一些题,让学生记下去,然后写答案在交上来。(还记得那个时候我近视看不清黑板的痛苦啊,那个时候我只能别人抄完了,我在照他们抄。)其实这就是模板方法模式能够解决的问题了,分析一下我们便知道大家每个人抄的题应该都是一样的吧,只有答案可能不一样,要是大家抄的选择题,那么不一样的东西就只有一个答案,区别可能就是A,B,C,D。可是每个人却都要抄一遍题,要是遇到一个我这样的近视,还可能把题抄错了。这就体现出来模板方法模式的重要性了,建立一个模板类,类中包括:模板方法和子类实现的方法。这里模板方法为题目+答案(调用类中的答案方法),子类实现的方法就是答案方法,这样做就避免了每个子类总都包含题目,使得每个子类中只需要包含答案。说恐怕怎么说也不直观,还是看看代码实现吧。
模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
2.模板方法模式应用举例
看看具体的模板类和具体实现是怎么实现的吧:
1 class TestpaperTemplate 2 { 3 public : 4 void templateMethod()//模板方法,定义了要完成操作的骨架 5 { 6 question1(); 7 answer1(); 8 question2(); 9 answer2(); 10 }; 11 void question1() 12 { 13 cout<<"问题一:二叉树每个节点儿子节点数目有多少:\n"; 14 cout<<"A.最多1个 B.最多两个 C.任意多个 D.至少一个"; 15 }; 16 void question2() 17 { 18 cout<<"问题二:完全二叉树叶子节点可能在哪一层:\n"; 19 cout<<"A.任意一层 B.最后一层 C.最后两层 D.最后三层"; 20 }; 21 protected: 22 virtual void answer1();//这两个方法的具体实现延时到子类,因不同的类而不同 23 virtual void answer2(); 24 }; 25 26 class StudentA :public TestpaperTemplate 27 { 28 virtual void answer1() 29 { 30 cout<<"答案:B"<<endl<<endl; 31 } 32 virtual void answer2() 33 { 34 cout<<"答案:A"<<endl<<endl; 35 } 36 }; 37 class StudentB :public TestpaperTemplate 38 { 39 //此处和StudentA中类似,只是每个学生选择的答案不同 40 };
这样一来,每个学生只需要写自己的答案就好了,避免抄题这种无用功了。
3.使用模板方法模式的场合和好处
模板方法模式是通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势的。也就提供了一个很好的代码复用平台。如果以后遇到这种情况:有一个过程需要执行,这个过程包括一系列步骤,整个过程从高层次看是一样的,但是每个步骤的具体细节不一样,这时我们就可以考虑这种模板方法模式了。即当不变的行为和可变的行为在类中混在一起的时候,不变的行为就会在子类中重复出现,这是通过模板方法模式把这些行为搬移到单一的地方实现(超类),而把不同的部分在子类实现,这就使子类摆脱了重复的不变行为的困扰。
应用实例:HttpServlet类提供了一个service()方法.这个方法调用了一个或是多个do方法,完成对客户端发起的请求的处理,这些do方法则是由具体的HttpServlet类提供的.那么这里的service()方法就是一个摸板方法.
学习中的一点总结,欢迎拍砖哦^^