java設計模式-- 模板模式 template pattern

模板模式 Template pattern

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

  通俗點的理解就是 :完成一件事情,有固定的數個步驟,但是每個步驟根據對象的不同,而實現細節不同;就可以在父類中定義一個完成該事情的總方法,按照完成事件需要的步驟去調用其每個步驟的實現方法。每個步驟的具體實現,由子類完成。

 實例說明

  來舉個例子: 比如我們做菜可以分爲三個步驟 (1)備料 (2)具體做菜 (3)盛菜端給客人享用,這三部就是算法的骨架 ;然而做不同菜需要的料,做的方法,以及如何盛裝給客人享用都是不同的這個就是不同的實現細節。

  下來我們就代碼實現如下

 a. 先來寫一個抽象的做菜父類:  

public abstract class DodishTemplate {    
    /**
     * 具體的整個過程
     */
    protected void dodish(){
        this.preparation();
        this.doing();
        this.carriedDishes();
    }
    /**
     * 備料
     */
    public abstract void preparation();
    /**
     * 做菜
     */
    public abstract void doing();
    /**
     * 上菜
     */
    public abstract void carriedDishes ();
}

 

 b. 下來做兩個番茄炒蛋(EggsWithTomato)和紅燒肉(Bouilli)實現父類中的抽象方法

 

/**
 * 西紅柿炒蛋
 * @author aries
 */
public class EggsWithTomato extends DodishTemplate{

    @Override
    public void preparation() {
        System.out.println("洗並切西紅柿,打雞蛋。");
    }

    @Override
    public void doing() {
        System.out.println("雞蛋倒入鍋裏,然後倒入西紅柿一起炒。");
    }

    @Override
    public void carriedDishes() {
        System.out.println("將炒好的西紅寺雞蛋裝入碟子裏,端給客人吃。");
    }

}

 

/**
 * 紅燒肉
 * @author aries
 *
 */
public class Bouilli extends DodishTemplate{

    @Override
    public void preparation() {
        System.out.println("切豬肉和土豆。");
    }

    @Override
    public void doing() {
        System.out.println("將切好的豬肉倒入鍋中炒一會然後倒入土豆連炒帶燉。");
    }

    @Override
    public void carriedDishes() {
        System.out.println("將做好的紅燒肉盛進碗裏端給客人吃。");
    }

}

  c. 在測試類中我們來做菜:

public class App {
    public static void main(String[] args) {
        DodishTemplate eggsWithTomato = new EggsWithTomato();
        eggsWithTomato.dodish();
        
        System.out.println("-----------------------------");
        
        DodishTemplate bouilli = new Bouilli();
        bouilli.dodish();
    }
}

 

 這樣我們就實現了使用模板模式的一個完整的實例。

 

模板模式的優點

 (1)具體細節步驟實現定義在子類中,子類定義詳細處理算法是不會改變算法整體結構。

 (2)代碼複用的基本技術,在數據庫設計中尤爲重要。

 (3)存在一種反向的控制結構,通過一個父類調用其子類的操作,通過子類對父類進行擴展增加新的行爲,符合“開閉原則”。

不足

    每個不同的實現都需要定義一個子類,會導致類的個數增加,系統更加龐大。

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章