1.模板方法模式动机
某一项任务,常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有原因(比如框架和应用之间的关系)而无法和任务的整体结构同时实现
在稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求。
2.问题的引入–标准化考试
标准化考试比较客观,题目相同
定义一个抽象类,具体方法实现相同的部分
抽象方法实现不同部分
class TestPaper
{
public void TestQuestion1()
{
System.out.println("杨过得到,后来给了郭靖,炼成倚天剑,屠龙刀的玄铁可能是【】a.球磨铸铁 b.马口铁 c.高速合成金钢 d.碳素纤维");
System.out.println("答案:"+Answer1());
}
public void TestQuestion2()
{
System.out.println("杨过,程英,陆无双铲除了情花,造成【】a.使这种植物不再害人b.使一种珍稀物种灭绝 c.破坏了那个生物圈的生态平衡d.造成该地区沙漠化");
System.out.println("答案:"+Answer2());
}
public void TestQustion3()
{
System.out.println("蓝凤凰致使华山师徒,桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药【】a.阿司匹林 b.氟哌酸 c.让他们喝大量的生牛奶 e.以上都错");
System.out.println("答案:"+Answer3());
}
protected String Answer1()
{ return ""; }
protected String Answer2()
{ return ""; }
protected String Answer3()
{ return ""; }
//这些方法可以被继承给子类重写,子类只需要重写这些方法把答案填上,因为父类建立了所有重复的模板。
//客户端代码
public class program{
public static void main(String[] args){
System.out.println("学生甲抄的试卷:");
//子类变量的声明改成父类,利用多态性,实现代码重用
TestPaper studentA=new TestPaperA();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();
System.out.println("学生乙抄的试卷:");
TestPaper student B=new TestPaperB();
studentA.TestQuestion1();
studentA.TestQuestion2();
studentA.TestQuestion3();
3.模板方法的特点
模板方法通过把不变行为搬移到超类,去除子类中的重复代码
提供了一个代码复用平台
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为就会在子类中重复出现。模板方法把这些行为搬移到单一的地方
是基于继承的代码复用的基本技术
4.优缺点
实现代码复用
缺点:
算法骨架不容易升级(模板和子类是非常耦合的)