模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。
模板方法模式中会在Abstract父类中定义一个final类型的模板方法,在这个方法中会定义主要的算法骨架,也就是子类的通用部分,而把有差异的部分实现在子类中去完成。模板方法定义为final类型的是因为final类型的方法不能被重写。保证算法骨架在父类中来定义。同时在abstract父类中会提供一个抽象方法让子类来重写。
下面是一个模拟考试的例子:
/**
* 抽象父类,定义算法骨架
* */
public abstract class TestPaper {
/**
* 模板方法定义为final类型,子类不能重写。使业务逻辑结构由父类控制
* */
public final void testQuertion(){
System.out.println("问题1:XXXXX");
System.out.print("问题1的答案:");
//模板方法中调用抽象类
answer();
}
/**
* 提供一个抽象方法让子类来实现差异部分
* */
protected abstract void answer();
}
/**
* 具体实现类A,重写父类抽象方法,实现自己特有部分
* */
public class TestPaperA extends TestPaper{
@Override
protected void answer() {
System.out.println("答案是A");
}
}
/**
* 具体实现类B,重写父类抽象方法,实现自己特有部分
* */
public class TestPaperB extends TestPaper{
@Override
protected void answer() {
System.out.println("答案是B");
}
}
测试类:
public class Test {
public static void main(String[] args) {
System.out.println("张三的测试:");
TestPaper paper1=new TestPaperA();
/**
* 此处调用的是模板方法,按照模板方法的逻辑骨架来执行,
* 在具体的差异部分,调用子类的具体实现
* */
paper1.testQuertion();
System.out.println("\n"+"李四的测试:");
TestPaper paper2=new TestPaperB();
paper2.testQuertion();//调用模板方法
}
}
输出结果:
张三的测试:
问题1:XXXXX
问题1的答案:答案是A
李四的测试:
问题1:XXXXX
问题1的答案:答案是B