模板模式Template

模板模式Template

存在意義

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

    • 抽象父類(AbstractClass):實現了模板方法,定義了算法的骨架。

    • 具體類(ConcreteClass):實現抽象類中的抽象方法,即不同的對象的具體實現細節。

代碼實現

  • 舉例: 比如我們做菜可以分爲三個步驟 (1)備料 (2)具體做菜 (3)盛菜端給客人享用,這三部就是算法的骨架 ;然而做不同菜需要的料,做的方法,以及如何盛裝給客人享用都是不同的這個就是不同的實現細節。
/**
 * 做菜3步驟: 1.備料 2.做菜 3.給客戶享用
 * 
 * @title
 * @description
 * @since JDK1.8
 */
public abstract class DodishTemplate {

    /**
     * 
     * 做菜三部曲
     * 
     * @authz Fan.W
     * @createtime 2018年1月7日 下午10:25:40
     */
    protected void dodish() {
        this.preparation();
        this.doing();
        this.serverDish();
    }

    /**
     * 
     * 備料
     * 
     * @authz Fan.W
     * @createtime 2018年1月7日 下午10:24:35
     */
    public abstract void preparation();

    /**
     * 
     * 開始做菜
     * 
     * @authz Fan.W
     * @createtime 2018年1月7日 下午10:24:43
     */
    public abstract void doing();

    /**
     * 
     * 給客人享用
     * 
     * @authz Fan.W
     * @createtime 2018年1月7日 下午10:24:52
     */
    public abstract void serverDish();

}
/**
 * 西紅柿炒雞蛋
 * 
 * @title
 * @description
 * @since JDK1.8
 */
public class EggsAndTomato extends DodishTemplate {
    /*
     * (非 Javadoc)
     * 
     * @see com.example.demo.template.DodishTemplate#preparation()
     */
    @Override
    public void preparation() {
        System.out.println("洗西紅柿,打雞蛋");

    }

    /*
     * (非 Javadoc)
     * 
     * @see com.example.demo.template.DodishTemplate#doing()
     */
    @Override
    public void doing() {
        System.out.println("雞蛋倒入鍋裏,然後把西紅柿也倒進去,一起炒");

    }

    /*
     * (非 Javadoc)
     * 
     * @see com.example.demo.template.DodishTemplate#serverDish()
     */
    @Override
    public void serverDish() {
        System.out.println("炒好之後給,放在盤子裏,端給客人");

    }

}
/**
 * 紅燒肉
 * 
 * @title
 * @description
 * @since JDK1.8
 */
public class Hongshaorou extends DodishTemplate {

    /*
     * (非 Javadoc)
     * 
     * @see com.example.demo.template.DodishTemplate#preparation()
     */
    @Override
    public void preparation() {
        System.out.println("先切豬肉和土豆");

    }

    /*
     * (非 Javadoc)
     * 
     * @see com.example.demo.template.DodishTemplate#doing()
     */
    @Override
    public void doing() {
        System.out.println("將切好的豬肉和土豆放到鍋裏  ,開始炒");

    }

    /*
     * (非 Javadoc)
     * 
     * @see com.example.demo.template.DodishTemplate#serverDish()
     */
    @Override
    public void serverDish() {
        System.out.println("將炒好的紅燒肉放到盤子裏面,端給客人");
    }

}
/**
 * 模板模式測試類
 * 
 * @title
 * @description
 * @since JDK1.8
 */
public class Main {

    public static void main(String[] args) {
        EggsAndTomato et = new EggsAndTomato();
        et.dodish();

        System.out.println("======================================================");

        Hongshaorou hsr = new Hongshaorou();
        hsr.dodish();
    }
}

結果打印: 
洗西紅柿,打雞蛋
雞蛋倒入鍋裏,然後把西紅柿也倒進去,一起炒
炒好之後給,放在盤子裏,端給客人
======================================================
先切豬肉和土豆
將切好的豬肉和土豆放到鍋裏  ,開始炒
將炒好的紅燒肉放到盤子裏面,端給客人

優點和缺點

  • 模板模式的優點

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

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

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

  • 不足

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

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