模板方法模式定義:算法
定義一個操做中的算法的框架,而將一些步驟延遲到子類中。使得子類能夠不改變一個算法的結構既能夠從新定義該算法的某些特定步驟。框架
基本方法也叫作基本操做,是由子類實現,而且在父類的模板方法中調用ide
能夠有一個或幾個,實現對基本方法的調用,完成固定的邏輯.函數
public abstract class AbstractClass { // 子類去完成.... protected abstract void doAnything() ; // protected abstract void doSomething(); // 模板具體實現 public void templateMethod() { System.out.println( this.getClass().getName()+ "調用模板基類的方法"); /** * 調用基本方法,完成邏輯.... */ this.doAnything(); this.doSomething(); } } public class ConcreteClass1 extends AbstractClass { /* 完成本身的一些事情..... * <p>Title: doAnything</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doAnything() */ @Override protected void doAnything() { // TODO Auto-generated method stub } /* (具體實現 * <p>Title: doSomething</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doSomething() */ @Override protected void doSomething() { // TODO Auto-generated method stub } } public class ConcreteClass2 extends AbstractClass { /* 具體實現..... * <p>Title: doAnything</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doAnything() */ @Override protected void doAnything() { // TODO Auto-generated method stub } /* 具體實現.... * <p>Title: doSomething</p> * <p>Description: </p> * @see com.spt.pattern.AbstractClass#doSomething() */ @Override protected void doSomething() { // TODO Auto-generated method stub } } public class TemplateClient { public static void main(String[] args) { // AbstractClass templateClass1 = new ConcreteClass1(); AbstractClass templateClass2 = new ConcreteClass2(); templateClass1.templateMethod(); templateClass2.templateMethod(); } }
多個子類有公有的方法,而且邏輯基本相同時。this
重要,複雜的算法,能夠把核心的算法設計爲模板的方法,周邊相關的細節功能由各個子類實現。spa
重構時,模板方法模式是一個常用的模式。把相同的的代碼抽取到父類中,而後經過鉤子函數約束其行爲。設計