設計模式-建立型模式-模板方法算法
定義一個操做中的算法框架,將一些步驟延遲到子類中,使得子類能夠不改變一個算法的結構便可重定義一個算法的步驟。設計模式
protected 對於本包及其子類可見。
代碼以下框架
public abstract class AbstractClass{ // 基本方法 protected abstract void doSomething(); // 對於本包及其子類可見 protected abstract void doAngthing(); public void templateMethod(){ this.doAngthing(); this.doSomething(); } }
public class ConcreteClass1 extends AbstractClass { // 基本方法 protected void doAnything(){ } protected void doSomething(){ } }
public class ConcreteClass2 extends AbstractClass { // 基本方法 protected void doAnything(){ } protected void doSomething(){ } }
最後場景類完成調用。函數
public class Client{ ConcreteClass1 class1 = ConcreteClass1(); ConcreteClass1 class2 = ConcreteClass1(); // 調用模板方法 class1.templateMethod(); class2.templateMethod(); }
public abstract class HummerModel{ // 能發動 protected abstract void start(); // 能停下來 protected abstract void stop(); // 會發出聲響 protected abstract void alarm(); // 引擎會響 protected abstract void engineBoom(); // 模型會跑 public final void run(){ // 發動汽車 this.start(); // 引擎轟鳴 this.engineBoom(); // 根據鉤子,判斷是否叫 if (this.isAlarm()){ this.alarm(); } // 停車 this.stop(); } // 鉤子 protected boolean isAlarm(){ return true; } }
而後擴展HummerH1Modelthis
public class HummerH1Model extends HummerModel{ private boolean alamFlag = true; // 默認會響 protected void alarm(){ } protected void engineBoom(){ } protected void start(){ } protected void stop(){ } protected boolean isAlarm(){ return this.alarmFlag; } // 要不要響喇叭,由客戶決定 public void setAlarm(boolean isAlarm){ this.alarmFlag = isAlarm; } }
public class HummerH2Model extends HummerModel{ private boolean alamFlag = true; // 默認會響 protected void alarm(){ } protected void engineBoom(){ } protected void start(){ } protected void stop(){ } protected boolean isAlarm(){ return this.alarmFlag; } // 要不要響喇叭,由客戶決定 public void setAlarm(boolean isAlarm){ this.alarmFlag = isAlarm; } }
最後定義場景spa
public class Client{ public static void main(String[] args){ // 生成一個HummerH1Model HummerH1Model h1 = new HummerH1Model(); // 而後設置喇叭 h1.setAlarm(false); // 啓動 h1.run(); // 模型2 HummerH2Model h2 = new HummerH2Model(); h2.run(); } }
上方使用了一個鉤子方法,即Hook Method 由一個鉤子,控制了整個的運行,灰常方便。
關於父類調用子類,不建議這樣作,使用以下作
把子類傳遞到父類的有參的構造函數中,而後調用
使用反射調用
父類調用子類的靜態方法。
總結:父類創建框架,子類重寫父類的部分方法,再調用從父類繼承而來的結果,此爲模板方法。
或者,當提供提供抽象類,並有一堆子類,須要擴展的時候,繼承抽象類,覆寫protected方法,而後調用execute方法,完成擴展。便可。設計
ts沒有多少相似的,故再也不闡述。code