1、定义
(Template)定义一个操作中的算法的骨架,而将一些步骤延迟到之类中。模板方法使得之类可以不改变一个算法的机构即可重定义该算法的某些特定步骤。
2、使用场景
学生甲和学生乙两个抄试卷标题,然后各自提交不同的答案,同时老师可以更改题目,而不影响学生答题。
3、代码结构UML图
金庸小说考题试卷:实现了一个模板方法,定义了算法的骨架,具体之类将重定义PrimitiveOperation以实现一个算法的步骤。
学生甲抄的试卷、学生乙抄的试卷:实现PrimitiveOperation以完成算法中与特点之类相关的步骤。
4、类的实现
(1)TestPaper(试卷父类)
public class TestPaper {
public void testQuestion1() {
System.out.println("杨过得到,后来给了郭靖,炼成倚天剑、屠龙刀的玄铁可能是[] a.球磨铸铁 b.马口铁 c.高速合金钢 d.碳素纤维 ");
System.out.println("答案:" + answer1());
}
public String answer1() {
return "";
}
public void testQuestion2() {
System.out.println("杨过、程英、陆无双铲除了情花,造成[] a.使这种植物不再害人 b.使一种珍惜物种灭绝 c.破坏了那个生物圈的生态平衡 d.造成了该地区沙漠化 ");
System.out.println("答案:" + answer2());
}
public String answer2() {
return "";
}
public void testQuestion3() {
System.out.println("蓝凤凰致使华山师徒、桃谷六仙呕吐不止,如果你是大夫,会给他们开什么药[] a.阿司匹林 b.牛黄解毒片 c.氟哌酸 d.让他喝大量的生牛奶 e.以上全不对");
System.out.println("答案:" + answer3());
}
public String answer3() {
return "";
}
}
(2)、TestPaperA(学生甲子类)
public class TestPaperA extends TestPaper {
@Override
public String answer1() {
return "b";
}
@Override
public String answer2() {
return "c";
}
@Override
public String answer3() {
return "a";
}
}
(3)、TestPaperB(学生乙子类)
public class TestPaperB extends TestPaper {
@Override
public String answer1() {
return "c";
}
@Override
public String answer2() {
return "c";
}
@Override
public String answer3() {
return "a";
}
}
5、客户端调用
public static void main(String[] args){
System.out.println("学生甲抄的试卷:");
TestPaper studentA=new TestPaperA();
studentA.testQuestion1();
studentA.testQuestion2();
studentA.testQuestion3();
System.out.println("学生乙抄的试卷:");
TestPaper studentB=new TestPaperB();
studentB.testQuestion1();
studentB.testQuestion2();
studentB.testQuestion3();
}
输出:
6、总结
用了继承,并且肯定这个继承有意义,就应该要成为之类的模板,所有重复的代码都应该要上升到父类去,而不是让每个之类都去重复。
当我们要完成在某一细节层次一致的一个过程或一些列步骤,但其个别步骤在更详细的层次上的实现可能不同时,我们通常考虑用模板方法模式来处理。
模板方法模式是通过把不变行为搬移到超类,去除子类中的重复代码来体现它的优势。
模板方法就是提供了一个很好的代码复用平台。
当不变的和可变的行为在方法的之类实现中混合在一起的时候,不变的行为就会在之类中重复出现。我们通过模板方法模式把这些行为搬移到单一的地方,这样就帮助之类摆脱重复的不变行为的纠缠。
参考:《大话设计模式》