模板方法模式
定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
- TestPaper
public abstract class TestPaper {
public void TestQuestion1() {
System.out.println("最喜欢的水果[] a.西瓜 b.柚子 c.苹果 d.哈密瓜");
System.out.println("答案:" + Answers()[0]);
}
public void TestQuestion2() {
System.out.println("最喜欢的明星[] a.周杰伦 b.蔡依林 c.杨幂 d.林俊杰");
System.out.println("答案:" + Answers()[1]);
}
public void TestQuestion3() {
System.out.println("最喜欢的声优[] a.花泽香菜 b.小仓唯 c.崛江由衣 d.雨宫天");
System.out.println("答案:" + Answers()[2]);
}
protected abstract String[] Answers();
}
- TestPaperA
public class TestPaperA extends TestPaper {
@Override
protected String[] Answers() {
return new String[]{"a", "b", "c"};
}
}
- TestPaperB
public class TestPaperB extends TestPaper {
@Override
protected String[] Answers() {
return new String[]{"b", "d", "a"};
}
}
- TestPaperProgram
public class TestPaperProgram {
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();
}
}
- 输出
学生甲的问卷
最喜欢的水果[] a.西瓜 b.柚子 c.苹果 d.哈密瓜
答案:a
最喜欢的明星[] a.周杰伦 b.蔡依林 c.杨幂 d.林俊杰
答案:b
最喜欢的声优[] a.花泽香菜 b.小仓唯 c.崛江由衣 d.雨宫天
答案:c
学生乙的问卷
最喜欢的水果[] a.西瓜 b.柚子 c.苹果 d.哈密瓜
答案:b
最喜欢的明星[] a.周杰伦 b.蔡依林 c.杨幂 d.林俊杰
答案:d
最喜欢的声优[] a.花泽香菜 b.小仓唯 c.崛江由衣 d.雨宫天
答案:a
- 分析
抽象类,也就是一抽象模板,定义并实现了一个模板方法.这个模板方法一般是一个具体方法,它给出一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类实现.顶级逻辑也有可能调用一些具体方法
通俗来讲, TestPaper抽象类,总结了子类可以复用的代码,提供抽象方法交由子类实现,总的逻辑结构已经搭建好,一些步骤由不同子类实现,体现了子类之间的差异性.模板方法模式在日常生活中还是比较常遇到的,上面的例子较为简单,有兴趣的同学可以想想生活中有哪些模板方法的例子
- 总结
模板方法模式是通过把不变的行为搬移到超类,去除子类中重复代码来体现它的优势,模板方法模式提供了一个很好的代码复用平台