模版方法模式比较简单,就是把相同的代码放在父类,子类实现各自不同的逻辑
UML
代码结构
public class Client {
public static void main(String[] args) {
System.out.println("学生甲抄的试卷:");
TestPaper studentA = new TestPaperA(); //与书中不同,这里的studentA是TestPaper类型
//而不是TestPaperA类型
studentA.testQuestion1();
studentA.testQuestion2();
System.out.println("学生乙抄的试卷:");
TestPaper studentB = new TestPaperB(); //与书中不同,这里的studentA是TestPaper类型
//而不是TestPaperA类型
studentB.testQuestion1();
studentB.testQuestion2();
}
}
书中使用模版方法模式后没有写Client的代码,没有使用模式的代码中Client与这里稍有不同,因为书中没有使用模式的代码中TestPaperA和TestPaperB并没有公共的父类
public abstract 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 abstract String answer1();
public abstract String answer2();
}
public class TestPaperA extends TestPaper {
@Override
public String answer1() {
return "b";
}
@Override
public String answer2() {
return "c";
}
}
public class TestPaperB extends TestPaper {
@Override
public String answer1() {
return "c";
}
@Override
public String answer2() {
return "a";
}
}
结果
模版方法应用比较多,比如在业务逻辑多变的场景中,定义一个父类做一下固定的业务逻辑(如日志、参数验证),然后把变化的业务定义为abstract方法,在具体子类中实现即可。