1. 程式人生 > >設計模式 - 模板方法模式詳解及其在Spring中的應用

設計模式 - 模板方法模式詳解及其在Spring中的應用

基本介紹

模板方法模式(Template Method Pattern)也叫模板模式,它在一個抽象類中公開定義了執行它的方法的模板,它的字類可以按需重寫方法實現,但呼叫將以抽象類中定義的方式進行。

簡單來說,模板方法模式定義一個操作中的演算法的骨架,將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構,就能重新定義該演算法的某些特定步驟

模式結構

  • AbstractClass:抽象類,類中實現了模板方法,定義了演算法的骨架

  • ConcreteClass:實現類,繼承抽象類,重寫其中的抽象方法

舉例說明

編寫一個製作豆漿的程式

製作豆漿的流程:選材(黃豆) → 新增配料 → 浸泡 → 磨豆漿

要求:通過新增不同的配料,可以製作出不同口味的豆漿(除了新增配料不同,其它步驟是相同的)

1、定義一個抽象類,BaseSoyMilk:豆漿類

public abstract class BaseSoyMilk {
    /**
     * 模板方法,製作豆漿的流程
     * 宣告為 final,防止子類重寫
     */
    protected final void make() {
        select();
        addOther();
        soak();
        grind();
    }

    private void select() {
        System.out.println("選擇上好的黃豆");
    }

    protected abstract void addOther();

    private void soak() {
        System.out.println("浸泡原材料");
    }

    private void grind() {
        System.out.println("研磨成豆漿");
    }
}

2、建立子類,PeanutSoyMilk:花生豆漿

public class PeanutSoyMilk extends BaseSoyMilk {
    @Override
    protected void addOther() {
        System.out.println("新增花生");
    }
}

RedBeanSoyMilk:紅豆豆漿

public class RedBeanSoyMilk extends BaseSoyMilk {
    @Override
    protected void addOther() {
        System.out.println("新增紅豆");
    }
}

3、建立測試類:Client

public class Client {
    @Test
    public void test() {
        BaseSoyMilk peanutSoyMilk = new PeanutSoyMilk();
        peanutSoyMilk.make();
        System.out.println("****************");
        BaseSoyMilk redBeanSoyMilk = new RedBeanSoyMilk();
        redBeanSoyMilk.make();
    }
}

4、執行結果

選擇上好的黃豆
新增花生
浸泡原材料
研磨成豆漿
************
選擇上好的黃豆
新增紅豆
浸泡原材料
研磨成豆漿

鉤子方法

在模板方法模式的抽象類中,我們可以定義一個方法,它預設不做任何事,子類可以視情況來決定是否重寫它,該方法稱為「鉤子」。

依然以上面製作豆漿的例子來說明,如果我們什麼配料都不想加,製作純豆漿,可以使用鉤子方法對其改造。

1、為 BaseSoyMilk 類新增一個方法 isAdd 判斷是否新增其它材料

public abstract class BaseSoyMilk {
    /**
     * 模板方法,製作豆漿的流程
     * 宣告為 final,防止子類重寫
     */
    protected final void make() {
        select();
        if(isAdd()){
            addOther();
        }
        soak();
        grind();
    }

    private void select() {
        System.out.println("選擇上好的黃豆");
    }

    protected abstract void addOther();

    private void soak() {
        System.out.println("浸泡原材料");
    }

    private void grind() {
        System.out.println("研磨成豆漿");
    }

    protected boolean isAdd(){
        return true;
    }
}

2、建立一個子類 PureSoyMilk:純豆漿

public class PureSoyMilk extends BaseSoyMilk {
    @Override
    protected void addOther() {
    }

    @Override
    protected boolean isAdd() {
        return false;
    }
}

3、測試

@Test
public void test2() {
    BaseSoyMilk pureSoyMilk = new PureSoyMilk();
    pureSoyMilk.make();
}

4、執行結果(現在就沒有新增其它材料的步驟了)

選擇上好的黃豆
浸泡原材料
研磨成豆漿

模式分析