1. 程式人生 > >java設計模式-- 模板模式 template pattern

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)存在一種反向的控制結構,通過一個父類呼叫其子類的操作,通過子類對父類進行擴充套件增加新的行為,符合“開閉原則”。

不足

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