設計模式——模板模式

botkke發表於2020-11-03

模板模式

1、基本介紹

  • 模板方法模式,又叫模板模式,在一個抽象類公開定義了執行它的方法模板,它的子類可以按照需求重寫方法,但呼叫將以抽象類中定義的方式進行
  • 模板方法模式定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個演算法的介面,就可以重定義該演算法的某些步驟

2、程式碼

public abstract class SoyaMilk {

    //模板方法,make,模板方法為final,不允許子類覆蓋
    final void make() {
        select();
        addCondiments();
        soak();
        beat();
    }

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

    //新增不同的配料,抽象方法
    abstract  void addCondiments();

    //浸泡
    void soak() {
        System.out.println("第三步,黃豆和配料開始浸泡");
    }

    void beat() {
        System.out.println("第四步,打豆漿");
    }
}
public class RedBeanSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        System.out.println("加入上好的紅豆");
    }
}
public class PeanutSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {
        System.out.println("加入上好的花生");
    }
}
public class Client {
    public static void main(String[] args) {
        //製作紅豆豆漿
        System.out.println("-------製作紅豆豆漿------");
        SoyaMilk redBeanSoyaMilk = new RedBeanSoyaMilk();
        redBeanSoyaMilk.make();

        System.out.println("-------製作花生豆漿------");
        SoyaMilk peanutSoyaMilk = new PeanutSoyaMilk();
        peanutSoyaMilk.make();
    }
}

3、模板模式的鉤子方法

  • 在模板模式的父類中,可以定義一個方法,預設不做任何事,子類可以視情況要不要覆蓋他,稱為鉤子
final void make() {
    select();
    if(customerWant())
        addCondiments();
    soak();
    beat();
}
//鉤子方法,決定是否需要新增配料
boolean customerWant() {
    return true;
}
public class PureSoyaMilk extends SoyaMilk {
    @Override
    void addCondiments() {

    }

    @Override
    boolean customerWant() {
        return false;//重寫鉤子方法使得模板方法不使用
    }
}

4、模板模式的特點

1)基本思想是:演算法只存在於一個地方,也就是父類中,容易修改。需要修改演算法時,只要修改父類的模板方法中的某些已經實現的某些步驟,子類就會繼承這些修改。

2)一般模板方法都加上final關鍵字,防止子類重寫模板方法。

3)使用場景: 要完成的一系列事情,這些事情步驟大致相同,只有一些不同時,可用模板方法。

4)優點: 既統一了演算法,也提供了很大的靈活性。父類的模板方法確保了演算法的結構保持不變,同時由子類提供部分步驟的實現。

5)缺點: 每個不同的實現類都需要一個子類實現,導致類的個數的增加,使系統更加龐大。

相關文章