設計模式-建立型模式-模板方法

設計模式-建立型模式-模板方法算法

定義一個操做中的算法框架,將一些步驟延遲到子類中,使得子類能夠不改變一個算法的結構便可重定義一個算法的步驟。設計模式

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

ts沒有多少相似的,故再也不闡述。code

相關文章
相關標籤/搜索