設計模式(二十二)模板模式

版權聲明:轉載必須註明本文轉自曉_晨的博客:http://blog.csdn.net/niunai112

目錄

導航

設計模式之六大設計原則
設計模式(一)單例模式
設計模式(二)工廠模式
設計模式(三)策略模式
設計模式(四)適配器模式
設計模式(五)享元模式
設計模式(六)建造者模式
設計模式(七)原型模式
設計模式(八)橋接模式
設計模式(九)外觀模式
設計模式(十)組合模式
設計模式(十一)裝飾器模式
設計模式(十二)代理模式
設計模式(十三)迭代器模式
設計模式(十四)觀察者模式
設計模式(十五)中介者模式
設計模式(十六)命令模式
設計模式(十七)狀態模式
設計模式(十八)訪問者模式
設計模式(十九)責任鏈模式
設計模式(二十)解釋器模式
設計模式(二十一)備忘錄模式
設計模式(二十二)模板模式
設計模式總結篇(爲什麼要學習設計模式,學習設計模式的好處)

前言

 抽象模板(Abstract Template):定義一個模板方法,它給出了一個邏輯的骨架,而邏輯的組成步驟在相應的抽象操作中,由具體的子類實現,其中各個子類都相同的函數,也在抽象模板中實現。定義抽象操作,讓子類實現,它們是一個頂級邏輯的組成步驟。
   具體模板(Concrete Template):實現父類所定義抽象方法,它們是一個頂級邏輯的組成步驟。每一個抽象模板角色都可以有任意多個具體模板角色與之對應,從而使得模板的最終結果各不相同。

例子

      對於飲品店來說,做一份飲品的套路是一樣的,我們可以把做飲品的套路定義成模板,肯定要拿杯子,加各種材料,加水(這裏的水泛指各種飲料),最後塑封或者加蓋。
這裏其實塑封的動作是大家都要做的,客人點的飲品不同,在所用的被子,加的材料,和加的水上會有所不同。
所以具體的實現類,要實現拿被子,加材料和加水的方法。

UML圖

template

/***
 *
 *@Author ChenjunWang
 *@Description:飲品模板類
 *@Date: Created in 15:56 2018/4/18
 *@Modified By:
 *
 */
public abstract class DrinkTemplate {

    //模板方法
    public void makeDrink(){
        takeBottle();
        addSomething();
        addWater();
        plasticBottle();
    }
    abstract void takeBottle();
    abstract void addSomething();
    abstract void addWater();
    void  plasticBottle(){
        System.out.println("塑封被子");
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:牛奶飲品類
 *@Date: Created in 16:17 2018/4/18
 *@Modified By:
 *
 */
public class MilkDrink extends DrinkTemplate{
    @Override
    void takeBottle() {

        System.out.println("拿牛奶杯");
    }

    @Override
    void addSomething() {

        System.out.println("加入果肉");
    }

    @Override
    void addWater() {

        System.out.println("加入牛奶");
    }
}
/***
 *
 *@Author ChenjunWang
 *@Description:珍珠奶茶飲品類
 *@Date: Created in 16:21 2018/4/18
 *@Modified By:
 *
 */
public class MilkTeaDrink extends DrinkTemplate {
    @Override
    void takeBottle() {
        System.out.println("拿放奶茶的被子");
    }

    @Override
    void addSomething() {

        System.out.println("加入珍珠");
    }

    @Override
    void addWater() {

        System.out.println("加一半牛奶");
        System.out.println("加一半紅茶");
    }
}


/***
 *
 *@Author ChenjunWang
 *@Description:測試類
 *@Date: Created in 16:21 2018/4/18
 *@Modified By:
 *
 */
public class Test {
    public static void main(String[] args) {
        System.out.println("--------------要一份牛奶------------------");
        MilkDrink milkDrink = new MilkDrink();
        milkDrink.makeDrink();

        System.out.println("--------------要一份珍珠奶茶------------------");
        MilkTeaDrink milkTeaDrink = new MilkTeaDrink();
        milkTeaDrink.makeDrink();
    }
}

運行結果如下
---------------------------------------------------
--------------要一份牛奶------------------
拿牛奶杯
加入果肉
加入牛奶
塑封被子
--------------要一份珍珠奶茶------------------
拿放奶茶的被子
加入珍珠
加一半牛奶
加一半紅茶
塑封被子

總結

優點

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

缺點

 (1)每一個不同的實現都需要一個子類來實現,導致類的個數增加,使得系統更加龐大。

隨着模板模式的結束,設計模式的學習到這裏就結束了,爲什麼只有22篇,因爲LZ工廠和抽象工廠都寫在第一篇裏面了。不信,各位看官可以去看看。另外各位看官假如能看到這,LZ相信,你們的收穫一定蠻大的,加油吧,各位爲夢想奮鬥的人!

Git地址

本篇實例Github地址:https://github.com/stackisok/Design-Pattern/tree/master/src/template

回到最上方


有什麼不懂或者不對的地方,歡迎留言。
喜歡LZ文章的小夥伴們,可以關注一波,也可以留言,LZ會回你們的。
覺得寫得不錯的小夥伴,歡迎轉載,但請附上原文地址,謝謝^_^!

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