模板方法模式:定義一個操做中的算法的骨架,而將一些步驟延遲到子類中。
模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟。
多見於繼承和多態中
模板方法在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