博客 / 詳情

返回

模板方法模式

定義一個算法骨架(模板),將算法中的某一些步驟對子類開放修改,以此來區別子類。

比如説在部隊中可能在一起的有炮兵、汽車兵、步兵等,他們每天都要訓練,訓練內容射擊、跑步是每個兵種每天都要練的,但是還有其它訓練是每個兵種自己獨有的訓練,那麼他們一條的訓練內容可能如下。

08:00 跑步
10:00 專業訓練A

14:00 專業訓練B
16:00 射擊訓練

以上就是部隊統一制定的訓練框架,那麼炮兵的訓練可能是

08:00 跑步
10:00 裝彈訓練A

14:00 防空訓練B
16:00 射擊訓練

模板方法模式可能有以下角色

  • 抽象類:定義統一的方法內容,定義抽象方法用於子類特殊實現,將這些方法組合成一個算法模板(同時裏面可能會有一些鈎子方法,這些鈎子方法實現為空,意思是可以讓子類重寫進行實現,不重寫也可以,這個步驟的有無根據自己需要)。
  • 具體實現類:繼承實現抽象類及抽象方法

下面使用一個炒菜的例子來實現模板方法模式

抽象類 - Cook

public abstract class Cook {
    final void template(){
        putOil();
        putMeat();
        putVegetable();
        putSalt();
        putAginomoto();
        plateLoading();
    }
    final void putOil(){
        System.out.println("放油");
    }
    abstract void putMeat();
    abstract void putVegetable();
    final void putSalt(){
        System.out.println("放鹽");
    };
    //放味精 - 根據自己喜好
    void putAginomoto(){

    }
    final void plateLoading(){
        System.out.println("裝盤");
    }
}

具體實現 - 炒韭菜、炒芹菜

public class CookLeek extends Cook{
    @Override
    void putMeat() {
        System.out.println("放入牛肉");
    }

    @Override
    void putVegetable() {
        System.out.println("放入韭菜");
    }
}
public class CookCelery extends Cook{
    @Override
    void putMeat() {
        System.out.println("放入豬肉");
    }

    @Override
    void putVegetable() {
        System.out.println("放入芹菜");
    }

    @Override
    void putAginomoto() {
        System.out.println("放入味精");
    }
}

測試

public class TemplateTest {
    @Test
    public void test(){
        Cook cook1 = new CookCelery();
        cook1.template();
        System.out.println("===================");
        Cook cook2 = new CookLeek();
        cook2.template();
    }
}
======測試======
放油
放入豬肉
放入芹菜
放鹽
放入味精
裝盤
===================
放油
放入牛肉
放入韭菜
放鹽
裝盤
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.