模板方法模式

什么是模板方法冰沙?即讓工作或流程順序按照寫好的模板進(jìn)行下去,同時(shí)還可以自定義流程,以及簡(jiǎn)化流程。

舉例:沖泡茶和咖啡均分四步進(jìn)行:

  1. 把水煮沸
  2. 沖泡咖啡(茶)
  3. 把咖啡(茶)倒入杯子
  4. 加糖(檸檬)

一般寫法

咖啡類

public class Coffee {

    public void prepare() {
        /**
         * 制作咖啡:
         * 1港庄。 把水煮沸
         * 2倔既。 用水沖泡
         * 3。 把咖啡倒進(jìn)杯子
         * 4鹏氧。 加糖
         */
        boilWater();
        brewCoffee();
        pourInCup();
        addSuger();
    }

    public void boilWater() {
        System.out.println("把水煮沸");
    }

    public void brewCoffee() {
        System.out.println("用水沖泡咖啡");
    }

    public void pourInCup() {
        System.out.println("把咖啡倒進(jìn)杯子");
    }

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

}

茶類

public class Tea {

    public void prepare() {
        /**
         * 制作茶:
         * 1渤涌。 把水煮沸
         * 2。 用水沖泡
         * 3把还。 把茶倒進(jìn)杯子
         * 4实蓬。 加檸檬
         */
        boilWater();
        pourInCup();
        pourInCup();
        addLemon();
    }

    public void boilWater() {
        System.out.println("把水煮沸");
    }

    public void brewTea() {
        System.out.println("用水沖泡茶");
    }

    public void pourInCup() {
        System.out.println("把茶倒進(jìn)杯子");
    }

    public void addLemon() {
        System.out.println("加檸檬");
    }

}

測(cè)試類

public class Test01 {

    /**
     * 這種實(shí)現(xiàn)方式有很多重復(fù)的代碼
     */
    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        Tea tea = new Tea();
        coffee.prepare();
        System.out.println("---------------");
        tea.prepare();
    }

}

模板方法

定義抽象的模板方法,把公共方法抽離出來笨篷,其它交給子類去實(shí)現(xiàn)

public abstract class DrinksTemplate {

    /**
     * 設(shè)定為final,不讓子類去覆蓋或篡改流程
     */
    final public void prepare() {
        boilWater();
        brew();
        pourInCup();
        add();
    }

    public void boilWater() {
        System.out.println("把水煮沸");
    }

    /**
     * 交給子類實(shí)現(xiàn)
     */
    public abstract void brew();

    public void pourInCup() {
        System.out.println("把飲料倒進(jìn)杯子");
    }

    public abstract void add();

}

咖啡類

public class Coffee extends DrinksTemplate {

    @Override
    public void brew() {
        System.out.println("用沸水沖泡咖啡");
    }

    @Override
    public void add() {
        System.out.println("加糖");
    }
}

茶類

public class Tea extends DrinksTemplate {

    @Override
    public void brew() {
        System.out.println("用沸水沖泡茶");
    }

    @Override
    public void add() {
        System.out.println("加檸檬");
    }
}

測(cè)試類

public class Test01 {

    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        Tea tea = new Tea();
        coffee.prepare();
        System.out.println("-----------");
        tea.prepare();
    }

}

使用鉤子函數(shù)

鉤子函數(shù)是在抽象模板方法中定義的瓣履,它的作用就是控制流程中的某個(gè)步驟是否執(zhí)行率翅、簡(jiǎn)化流程,子類可以選擇覆蓋袖迎。比如冕臭,在準(zhǔn)備給用戶沖泡咖啡或茶之前詢問用戶是否需要加糖或者檸檬,不需要就不進(jìn)行加糖或檸檬這一步驟了燕锥。

抽象模板方法

public abstract class DrinksTemplate {

    /**
     * 設(shè)定為final辜贵,不讓子類去覆蓋或篡改流程
     */
    final public void prepare() {
        boilWater();
        brew();
        pourInCup();
        if (ifAdd()) {
            add();
        }
    }

    public void boilWater() {
        System.out.println("把水煮沸");
    }

    /**
     * 交給子類實(shí)現(xiàn)
     */
    public abstract void brew();

    public void pourInCup() {
        System.out.println("把飲料倒進(jìn)杯子");
    }

    public abstract void add();

    /**
     * 鉤子函數(shù)
     */
    public Boolean ifAdd() {
        return true;
    }

}

只讓茶類去覆蓋鉤子函數(shù)

@Data
public class Tea extends DrinksTemplate {

    private Boolean ifAdd;

    @Override
    public void brew() {
        System.out.println("用沸水沖泡茶");
    }

    @Override
    public void add() {
        System.out.println("加檸檬");
    }

    @Override
    public Boolean ifAdd() {
        return ifAdd;
    }
}

測(cè)試類

@SuppressWarnings("Duplicates")
public class Test01 {

    public static void main(String[] args) {
        Coffee coffee = new Coffee();
        Tea tea = new Tea();
        // 啟用鉤子函數(shù)
        tea.setIfAdd(false);
        coffee.prepare();
        System.out.println("==========");
        tea.prepare();
    }

}

測(cè)試結(jié)果

把水煮沸
用沸水沖泡咖啡
把飲料倒進(jìn)杯子
加糖
==========
把水煮沸
用沸水沖泡茶
把飲料倒進(jìn)杯子
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市归形,隨后出現(xiàn)的幾起案子托慨,更是在濱河造成了極大的恐慌,老刑警劉巖暇榴,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厚棵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蔼紧,警方通過查閱死者的電腦和手機(jī)婆硬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奸例,“玉大人彬犯,你說我怎么就攤上這事〔榈酰” “怎么了谐区?”我有些...
    開封第一講書人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逻卖。 經(jīng)常有香客問我卢佣,道長(zhǎng),這世上最難降的妖魔是什么箭阶? 我笑而不...
    開封第一講書人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任虚茶,我火速辦了婚禮戈鲁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嘹叫。我一直安慰自己婆殿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開白布罩扇。 她就那樣靜靜地躺著婆芦,像睡著了一般浑测。 火紅的嫁衣襯著肌膚如雪黄痪。 梳的紋絲不亂的頭發(fā)上壤圃,一...
    開封第一講書人閱讀 51,443評(píng)論 1 302
  • 那天黄橘,我揣著相機(jī)與錄音顽决,去河邊找鬼藐吮。 笑死器虾,一個(gè)胖子當(dāng)著我的面吹牛朵锣,可吹牛的內(nèi)容都是我干的捞高。 我是一名探鬼主播氯材,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼硝岗!你這毒婦竟也來了氢哮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤型檀,失蹤者是張志新(化名)和其女友劉穎冗尤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胀溺,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡生闲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了月幌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍讯。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖扯躺,靈堂內(nèi)的尸體忽然破棺而出捉兴,到底是詐尸還是另有隱情,我是刑警寧澤录语,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布倍啥,位于F島的核電站,受9級(jí)特大地震影響澎埠,放射性物質(zhì)發(fā)生泄漏虽缕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一蒲稳、第九天 我趴在偏房一處隱蔽的房頂上張望氮趋。 院中可真熱鬧伍派,春花似錦、人聲如沸剩胁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)昵观。三九已至晾腔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間啊犬,已是汗流浹背灼擂。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留觉至,地道東北人剔应。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像康谆,于是被迫代替她去往敵國(guó)和親领斥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嫉到,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354