­

模板方法模式

基本介紹

模板方法模式 是在一個固定步驟的方法骨架中,將某些步驟延遲到子類實現,以便重新定義該方法中的某些特定步驟。

模板方法模式屬於行為型模式,較為簡單。

 

假設我們開了一家早餐店,每天早上一大早我們就要研磨豆漿,研磨豆漿的步驟都是特定的,只是原材料不同,它們都要進行 選材 -》 添加配料 -》 浸泡 -》 放到豆漿機研磨

  • 添加不同的配料可以製作不同口味的豆漿
  • 選材、浸泡以及豆漿機研磨這幾個步驟對於每種口味的豆漿而言都是相同的

 

模板方法模式

根據上面的場景,我們顯然發現在所有步驟里,唯獨添加配料這個步驟是不同的,那麼我們就把這個步驟交給子類實現

 

豆漿類

/**
 * 抽象類表示豆漿
 */
public abstract class SoyaMilk {

    /**
     * 模板方法, make, 模板方法可以製作成final,不讓子類去覆蓋
     */
    final void make(){
        select();
        if(isAddCondiments()){
            addCondiments();
        }
        soak();
        beat();
    }

    /**
     * 選材料
     */
    private void select(){
        System.out.println("第一步:選擇上好的新鮮黃豆");
    }

    /**
     * 添加不同的配料,抽象方法,讓子類去實現具體的邏輯
     */
    abstract void addCondiments();

    /**
     * 鉤子方法 是否添加配料
     */
    abstract boolean isAddCondiments();

    /**
     * 浸泡
     */
    private void soak(){
        System.out.println("第三步:黃豆和配料開始浸泡, 需要3小時");
    }

    private void beat(){
        System.out.println("第四步:用豆漿機打磨黃豆和配料");
    }


}

 

紅豆豆漿

/**
 * 紅豆豆漿
 */
public class ReadBeanMilk extends SoyaMilk {

    @Override
    void addCondiments() {
        System.out.println("加入上好的紅豆");
    }

    @Override
    boolean isAddCondiments() {
        return true;
    }

}

 

花生豆漿

/**
 * 花生豆漿
 */
public class PeanutSoyaMilk extends  SoyaMilk{

    @Override
    void addCondiments() {
        System.out.println("加入上好的花生");
    }

    @Override
    boolean isAddCondiments() {
        return true;
    }

}

 

純豆漿(純豆漿不添加任何配料),需要利用鉤子方法

/**
 * 純豆漿
 */
public class PureMilk extends SoyaMilk{
    
    void addCondiments(){}; 

    @Override
    boolean isAddCondiments() {
        return false;
    }
}

 

註: 在模板方法模式的父類,定義一個方法不做任何事,子類可以視情況要不要覆蓋它,稱該方法「為鉤子」