設(shè)計(jì)模式之模版模式(Template Pattern)

What:

定義一個(gè)操作中的算法骨架栏妖,而將算法的一些步驟延遲到子類中灾炭,使得子類可以不改變該算法結(jié)構(gòu)的情況下重定義該算法的某些特定步驟返敬。

Why:

優(yōu)點(diǎn):

1.封裝不變部分挡闰,擴(kuò)展可變部分逗扒。
2.提取公共代碼古戴,便于維護(hù)。
3.行為由父類控制矩肩,子類實(shí)現(xiàn)现恼,符合開閉原則。
4.代碼復(fù)用黍檩,減少代碼冗余叉袍。

缺點(diǎn):

1.每一個(gè)不同的實(shí)現(xiàn)都需要增加子類,導(dǎo)致類數(shù)目增加刽酱,增加類系統(tǒng)的復(fù)雜度喳逛;
2.由于繼承的關(guān)系,父類增加或者修改抽象方法棵里,子類都需要修改润文。

Where:

1.多個(gè)類共有的方法姐呐,且邏輯相同。
2.一次性實(shí)現(xiàn)一個(gè)算法的不變部分转唉,并將可變的行為留給子類實(shí)現(xiàn)皮钠。

How:

模版模式的角色比較簡單,只有抽象父類和具體子類赠法。

AbstractClass(抽象父類): 定義模版方法麦轰,也就是定義一些公共的行為,將可變的行為抽象砖织,讓子類具體實(shí)現(xiàn)款侵。

ConcreteClass(具體子類): 實(shí)現(xiàn)抽象父類,具體實(shí)現(xiàn)可變的行為侧纯。

模版模式UML

在寫具體代碼之前新锈,先了解一下鉤子方法

鉤子方法是什么呢眶熬?

就是在抽象類中定義一個(gè)方法妹笆,默認(rèn)不做任何事,子類可以根據(jù)實(shí)際情況要不要覆蓋它娜氏,從而改變行為拳缠,該方法稱為“鉤子”。

示例:模擬制作咖啡店家接收訂單的過程贸弥。父類Coffee定義了共有的方法窟坐,如加熱水,研磨咖啡豆绵疲,同時(shí)也定義了可變部分哲鸳,有的消費(fèi)者不喜歡加奶加糖,所以定義了鉤子方法isAddMilkFlag和isAddSugarFlag判斷是否需要加奶和糖盔憨。而子類繼承抽象父類根據(jù)實(shí)際需要判斷是否需要添加奶和糖徙菠。

Coffee(抽象父類):

public abstract class Coffee {

    boolean addSugarFlag = false;

    boolean addMilkFlag = false;

    public boolean isAddMilkFlag() {
        return addMilkFlag;
    }

    public boolean isAddSugarFlag() {
        return addSugarFlag;
    }

    Coffee prepareHotWater(){
        System.out.println("準(zhǔn)備熱水");
        return this;
    }

    Coffee grindCoffeeBean(){
        System.out.println("研磨咖啡豆");
        return this;
    }

    void addSugar(){
        System.out.println("加糖");
    }

    void addMilk(){
        System.out.println("加奶");
    }

    Coffee make(String coffeeName){
        Coffee coffee = prepareHotWater().grindCoffeeBean();
        if(isAddMilkFlag()){
            coffee.addMilk();
        }
        if(isAddSugarFlag()){
            coffee.addSugar();
        }
        System.out.println("制作完成!這是一杯"
                + (isAddSugarFlag() ? "加" : "不加") + "糖,"
                + (isAddMilkFlag() ? "加" : "不加") + "奶"
                + "的" + coffeeName);
        return coffee;
    }
}

Cappuccino類和Latte類:

public class Cappuccino extends Coffee {

    String coffeeName = "卡布奇諾";

    Coffee make(){
        return super.make(this.coffeeName);
    }

    @Override
    public boolean isAddSugarFlag() {
        return true;
    }
}

public class Latte extends Coffee {
    String coffeeName = "拿鐵";

    Coffee make(){
        return super.make(this.coffeeName);
    }

    @Override
    public boolean isAddMilkFlag() {
        return true;
    }

    @Override
    public boolean isAddSugarFlag() {
        return true;
    }
}

Test:測試類

public class Test {
    public static void main(String[] args) {
        System.out.println("******  下訂單:一杯加糖,不加奶的熱卡布奇諾  ******");
        Cappuccino cappuccino = new Cappuccino();
        cappuccino.make();
        System.out.println("******  下訂單:一杯加糖,加奶的熱拿鐵  ******");
        Latte latte = new Latte();
        latte.make();
    }
}

輸出結(jié)果:

******  下訂單:一杯加糖,不加奶的熱卡布奇諾  ******
準(zhǔn)備熱水
研磨咖啡豆
加糖
制作完成郁岩!這是一杯加糖,不加奶的卡布奇諾
******  下訂單:一杯加糖,加奶的熱拿鐵  ******
準(zhǔn)備熱水
研磨咖啡豆
加奶
加糖
制作完成懒豹!這是一杯加糖,加奶的拿鐵

總結(jié)

使用模版模式可以很方便的將共有的代碼提取出來,能降低代碼的冗余驯用,加快開發(fā)效率。在實(shí)際開發(fā)中也經(jīng)常用到模版模式的設(shè)計(jì)思想儒老。譬如前端html頁面蝴乔,頁頭和頁尾總是一樣的,那么可以創(chuàng)建頁頭(header.html)和頁尾(footer.html)模版驮樊,在每個(gè)html頁面都直接引用薇正,這樣的話片酝,既能夠節(jié)省時(shí)間,又能大大的減少代碼量挖腰。

了解更多設(shè)計(jì)模式:

設(shè)計(jì)模式系列

參考資料:

https://www.runoob.com/design-pattern/template-pattern.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雕沿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子猴仑,更是在濱河造成了極大的恐慌审轮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辽俗,死亡現(xiàn)場離奇詭異疾渣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)崖飘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進(jìn)店門榴捡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人朱浴,你說我怎么就攤上這事吊圾。” “怎么了翰蠢?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵项乒,是天一觀的道長。 經(jīng)常有香客問我躏筏,道長板丽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任趁尼,我火速辦了婚禮埃碱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酥泞。我一直安慰自己砚殿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布芝囤。 她就那樣靜靜地躺著似炎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪悯姊。 梳的紋絲不亂的頭發(fā)上羡藐,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天,我揣著相機(jī)與錄音悯许,去河邊找鬼仆嗦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛先壕,可吹牛的內(nèi)容都是我干的瘩扼。 我是一名探鬼主播谆甜,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼集绰!你這毒婦竟也來了规辱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤栽燕,失蹤者是張志新(化名)和其女友劉穎罕袋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纫谅,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炫贤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了付秕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兰珍。...
    茶點(diǎn)故事閱讀 39,834評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖询吴,靈堂內(nèi)的尸體忽然破棺而出掠河,到底是詐尸還是另有隱情,我是刑警寧澤猛计,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布唠摹,位于F島的核電站,受9級特大地震影響奉瘤,放射性物質(zhì)發(fā)生泄漏勾拉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一盗温、第九天 我趴在偏房一處隱蔽的房頂上張望藕赞。 院中可真熱鬧,春花似錦卖局、人聲如沸斧蜕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽批销。三九已至,卻和暖如春染坯,著一層夾襖步出監(jiān)牢的瞬間均芽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工单鹿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骡技,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像布朦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子昼窗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容