通过AB卷来简单梳理模板方法模式
学生时代考试时,经常涉及到AB卷,假如现在需要出两套试卷,试题及答案有差异但不大,这个时候该如何设计呢?
我们可以用模板方法模式来考虑这个问题。
模板方法模式实现
定义试卷基类
首先定义一个试卷基类,方便真实的试卷来继承公用的部分
public class TestPaper {
public void TestQuestion1(){
System.out.println("问题1");
System.out.println("答案1:"+Answer1());
}
protected String Answer1(){
return "";
}
public void TestQuestion2(){
System.out.println("问题2");
System.out.println("答案2:"+Answer2());
}
protected String Answer2(){
return "";
}
public void TestQuestion3(){
System.out.println("问题3");
System.out.println("答案3:"+Answer3());
}
protected String Answer3(){
return "";
}
}
定义具体的实现类
public class TestPaperA extends TestPaper{
@Override
public String Answer1(){
return "a";
}
@Override
public String Answer2(){
return "b";
}
@Override
public String Answer3(){
return "c";
}
}
public class TestPaperB extends TestPaper{
@Override
public String Answer1(){
return "d";
}
@Override
public String Answer2(){
return "e";
}
@Override
public String Answer3(){
return "f";
}
}
定义业务方法
看在具体业务逻辑中如何使用
public class TemplateMethod {
public static void main(String[] args) {
//模板方法模式
func1();
}
public static void func1(){
System.out.println("A试卷:");
TestPaper paperA = new TestPaperA();
paperA.TestQuestion1();
paperA.TestQuestion2();
paperA.TestQuestion3();
System.out.println("B试卷:");
TestPaper paperB = new TestPaperB();
paperB.TestQuestion1();
paperB.TestQuestion2();
paperB.TestQuestion3();
}
}
执行结果
A试卷:
问题1
答案1:a
问题2
答案2:b
问题3
答案3:c
B试卷:
问题1
答案1:d
问题2
答案2:e
问题3
答案3:f
结果分析
模板方法模式,定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。