模板方法模式:定义一个操做中的算法的骨架,而将一些步骤延迟到子类中。
模板方法使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。
多见于继承和多态中
模板方法在java中的体现很是多:
java
(1)JUnit中的TestCase以及它的子类就是一个模板方法模式的例子。
(2)Struts框架控制器的核心类RequestProcess里面的process方法也是采用了经典的模板方法模式,里面定义
好了流程的步骤,而步骤里面的不少环节,咱们都是能够重写的。
(3)Spring用另外一种方式实现了Template Method模式。Spring对Hibernate的调用提供了HibernateDaoSupport的支持,在该类中,有了一个HibernateTemplate类来调用Hiebarnate接口,经过另一种方式使用Template Method模式,避免了开发者代码中出现诸如Session管理、事务控制等重复代码。
示例:
算法
/** * @author yh.z * 模板方法模式,多见于继承多态 */ public class TemplateMethod { public static void main(String[] args) { StudentA stuA = new StudentA(); StudentB stuB = new StudentB(); System.out.println("学生A:" + stuA.subjectA() + "\n" + stuA.subjectB()); System.out.println("学生B:" + stuB.subjectA() + "\n" + stuB.subjectB()); } } //试卷类AbstractClass abstract class TestPaper { //每个学生试卷题目同样 public String subjectA() { return getAnswerA(); } public String subjectB() { return getAnswerB(); } //每个学生答案不必定同样 public abstract String getAnswerA(); public abstract String getAnswerB(); } //学生A class StudentA extends TestPaper { @Override public String getAnswerA() { return "subjectA:a"; } @Override public String getAnswerB() { return "subjectB:a"; } } //学生B class StudentB extends TestPaper { @Override public String getAnswerA() { return "subjectA:b"; } @Override public String getAnswerB() { return "subjectB:b"; } }输出: 学生A:subjectA:a subjectB:a 学生B:subjectA:b subjectB:b