模板方法模式(TemplateMethod):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个
算法的结构即可重新定义该算法的某些特定步骤。
模板方法模式结构图:
案例展示:老师讲试题抄写在黑板上,每个学生在答题卡上写上答案,
1:创建一个试题的超类。
package TemplateMethod; /** * 试卷类 * @author 我不是张英俊 * */ public abstract class TestPaper { public void testQuestion1(){ System.out.println("先有鸡还是先有蛋()"); System.out.println("A:鸡 B:蛋 C:A and B D:以上答案都错误"); } public void testQuestion2(){ System.out.println("铁锈的主要成分是()"); System.out.println("A:C元素 B:Al元素 C:Fe元素 D:O元素"); } public void testQuestion3(){ System.out.println("马是怎么睡觉的()"); System.out.println("A:躺着 B:趴着 C:坐着 D:站着"); } public abstract String answer1(); public abstract String answer2(); public abstract String answer3(); }
2:学生1的答题纸。
package TemplateMethod; public class Student1 extends TestPaper{ @Override public String answer1() { // TODO Auto-generated method stub return "A"; } @Override public String answer2() { // TODO Auto-generated method stub return "B"; } @Override public String answer3() { // TODO Auto-generated method stub return "C"; } }
3:学生2的答题纸
package TemplateMethod; public class Student2 extends TestPaper { @Override public String answer1() { // TODO Auto-generated method stub return "C"; } @Override public String answer2() { // TODO Auto-generated method stub return "B"; } @Override public String answer3() { // TODO Auto-generated method stub return "A"; } }
4:测试类.
package TemplateMethod; /** * 需求:考试抄试卷, * 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类 * 可以不改变一个算法的解耦股即可重新定义该算法的某些特定步骤。 * @author 我不是张英俊 * */ public class Test { public static void main(String[] args) { //可以理解为:老师将试题抄在黑板上,然后大家看,在纸上写上各自的答案 //然后将各自的纸交给老师。 TestPaper s1=new Student1 (); System.out.println("学生1交的答题卡"); System.out.println(s1.answer1()); System.out.println(s1.answer2()); System.out.println(s1.answer3()); TestPaper s2=new Student2(); System.out.println("学生2交的答题卡"); System.out.println(s2.answer1()); System.out.println(s2.answer2()); System.out.println(s2.answer3()); } }
5:控制台
学生1交的答题卡
A
B
C
学生2交的答题卡
C
B
A
总结:模板方法模式通过把不变的行为搬移到超类,去除子类中的重复代码来体现它的优势。模板方法模式就是提供了一个很好的代码复用的平台。
当不变的和可变的行为在方法的子类实现中混合在一起的时候,不变的行为在子类中重复的出现,我们通过模板方法模式把这些行为搬移到单一的地方,
这样就帮互助子类摆脱重复的不变行为的纠缠。
缺点是每个不同的实现都必须写一个子类,增加了子类的数量,但是此种设计就更符合单一职责原则,提高了内聚。