1. 程式人生 > 實用技巧 >鏈塔智庫|區塊鏈產業要聞及動態週報(2020年10月第2周)

鏈塔智庫|區塊鏈產業要聞及動態週報(2020年10月第2周)

定義:定義一個操作中演算法的框架,而將一些步驟延遲到子類中,使得子類可以不改變演算法的結構即可重定義該演算法中的某些特定步驟。

需要實現一套相同流程,只需要子類去繼承模板類

程式碼:

模板類Cook

public abstract class Cook {
    public abstract void oil();
    public abstract void egg();
    public abstract void tomato();

    // 定義方法執行順序,具體步驟延遲到子類完成
    public void doCook() {
        this.oil();
        
this.egg(); this.tomato(); } }
MeCook:
public class MeCook extends Cook {

    @Override
    public void oil() {
        System.out.println("I put oil");
    }

    @Override
    public void egg() {
        System.out.println("I put egg");
    }

    @Override
    public void tomato() {
        System.
out.println("I put tomato"); } }
MasterCook:
public class MasterCook extends Cook {
    @Override
    public void oil() {
        System.out.println("master put oil");
    }

    @Override
    public void egg() {
        System.out.println("master put egg");
    }

    @Override
    public void
tomato() { System.out.println("master put tomato"); } }

測試類:

public class Test1 {
    public static void main(String[] args) {
        MeCook meCook = new MeCook();
        meCook.doCook();
        MasterCook masterCook = new MasterCook();
        masterCook.doCook();
    }
}

執行:

這樣我和大廚都執行了一套相同的流程, 但是這樣也有缺點,每個子類都要做一樣的步驟,假如哪個子類想做少一些步驟呢,這樣就不適用了。

所以就有了鉤子函式:鉤子的作用,讓子類去決定這個步驟要不要做

程式碼:

HookCook :
public abstract class HookCook {
    //鉤子方法,在模板方法中使用,子類可以重寫這個方法來決定要不要這個步驟
    public boolean isAddTomato() {
        return true;
    }
    public abstract void oil();
    public abstract void egg();
    public abstract void tomato();


    public void doCook() {
        this.oil();
        this.egg();
        if(isAddTomato()) {
            this.tomato();
        }
    }
}
MeCook :
public class MeCook extends HookCook {
    boolean b = true;
    public MeCook() {

    }
    public MeCook(boolean b){
        this.b = b;
    }

    @Override
    public boolean isAddTomato() {
        return this.b;
    }

    @Override
    public void oil() {
        System.out.println("I put oil");
    }

    @Override
    public void egg() {
        System.out.println("I put egg");
    }

    @Override
    public void tomato() {
        System.out.println("I put tomato");
    }
}
MasterCook :
public class MasterCook extends HookCook {

    boolean b = true;
    public MasterCook() {

    }
    public MasterCook(boolean b){
        this.b = b;
    }

    @Override
    public boolean isAddTomato() {
        return this.b;
    }


    @Override
    public void oil() {
        System.out.println("master put oil");
    }

    @Override
    public void egg() {
        System.out.println("master put egg");
    }

    @Override
    public void tomato() {
        System.out.println("master put tomato");
    }
}

測試類:

public class TestHookTemplate {
    public static void main(String[] args) {
        MeCook meCook = new MeCook(true);
        meCook.doCook();
        //大師不需要放西紅柿
        MasterCook masterCook = new MasterCook(false);
        masterCook.doCook();
    }
}

結果: