摘要:讓一切變得更簡(jiǎn)單抽象化深入封裝算法塊,這便是設(shè)計(jì)模式當(dāng)中的一種模式模板方法模式。定義模板方法模式在一個(gè)方法中定義一個(gè)算法的框架,而將一些步驟延遲到子類(lèi)中。
讓一切變得更簡(jiǎn)單抽象化
深入封裝算法塊,這便是設(shè)計(jì)模式當(dāng)中的一種模式:模板方法模式。
我們先來(lái)看看下面兩個(gè)茶和咖啡配方
也許我們可以很快用Java代碼實(shí)現(xiàn)出來(lái),但我覺(jué)得做之前先分析分析,咖啡和茶的沖泡方式中第(1)步驟是完全一樣的,我認(rèn)為這樣肯定會(huì)出現(xiàn)重復(fù)代碼,寫(xiě)代碼盡量不寫(xiě)重復(fù)代碼,而第(2)(3)(4)步驟大體相似,
我們將兩者步驟合起來(lái)看看
實(shí)現(xiàn)代碼如下
咖啡因抽象類(lèi)
package 改進(jìn)之后; /** * 咖啡因飲料(抽象類(lèi)) 帶鉤子方法 模板方法 * * @author Joy * */ public abstract class CaffeineBeverageWithHook { // 制作流程 public void prepareRecipe() { boilWater(); brew(); pourInCup(); /* * 加上一個(gè)條件,具體有customerWantsCondiments()方法決定,當(dāng)用戶(hù)“想要”調(diào)料時(shí),才調(diào)用addCondiments()方法 */ if (customerWantsCondiments()) { addCondiments(); } } /** * 因?yàn)榭Х群筒瓒加羞@兩個(gè)方法,但只是具體實(shí)現(xiàn)不同 所以這兩個(gè)方法必須聲明為抽象,具體實(shí)現(xiàn)交由子類(lèi) */ // 沖泡的方法抽取出來(lái) public abstract void brew(); // 加調(diào)料方法抽取出來(lái) public abstract void addCondiments(); public void boilWater() { System.out.println("煮沸水"); } public void pourInCup() { System.out.println("將飲料倒入杯子中"); } /** * 定義一個(gè)方法(通常為空),這個(gè)方法只會(huì)返回true 這就是一個(gè)鉤子方法 子類(lèi)需根據(jù)需求是否覆蓋這個(gè)方法 * * @return */ // 添加一個(gè)新(“鉤子”)方法,判斷顧客是否需要添加調(diào)料 public boolean customerWantsCondiments() { return true; } }
咖啡類(lèi)
package 改進(jìn)之后; import java.util.Scanner; public class CoffeeWithHook extends CaffeineBeverageWithHook { @Override public void brew() { System.out.println("把沸水沖泡咖啡"); } @Override public void addCondiments() { System.out.println("加糖加牛奶"); } // 對(duì)此作出判斷 public boolean customerWantsCondiments() { String answer = getUserInput(); if (answer.equals("y")) { return true; } System.out.println("咖啡不加調(diào)料"); return false; } // 詢(xún)問(wèn)顧客是否需要加糖加奶 private String getUserInput() { String answer = null; Scanner input = new Scanner(System.in); System.out.println("請(qǐng)問(wèn)你是否需要在咖啡里加糖加奶呢?(y/n)"); answer = input.next(); if (answer.equals("y")) { return answer; } else if (answer.equals("n")) { return answer; } else { return "error"; } } }
茶類(lèi)
package 改進(jìn)之后; import java.util.Scanner; public class TeaWithHook extends CaffeineBeverageWithHook { @Override public void brew() { System.out.println("把沸水浸泡茶葉"); } @Override public void addCondiments() { System.out.println("加檸檬"); } @Override public boolean customerWantsCondiments() { String answer = getUserInput(); if (answer.equals("y")) { return true; } System.out.println("茶不加調(diào)料"); return false; } // 詢(xún)問(wèn)顧客是否需要加糖加奶 private String getUserInput() { String answer = null; Scanner input = new Scanner(System.in); System.out.println("請(qǐng)問(wèn)你是否需要在茶里加檸檬呢?(y/n)"); answer = input.next(); if (answer.equals("y")) { return answer; } else if (answer.equals("n")) { return answer; } else { return "error"; } } }
測(cè)試類(lèi)
package 改進(jìn)之后; public class TestMain { public static void main(String[] args) { CoffeeWithHook coffeeHook = new CoffeeWithHook(); TeaWithHook teaHook = new TeaWithHook(); System.out.println("========制作咖啡"); coffeeHook.prepareRecipe(); System.out.println(" ========制作茶"); teaHook.prepareRecipe(); } }
效果圖
而所謂“鉤子”方法其實(shí)是根據(jù)不同情況而做出不同響應(yīng)結(jié)果的一種判斷方法,這其我就實(shí)現(xiàn)一個(gè)最簡(jiǎn)單的鉤子方法,根據(jù)y/n的輸入得出用戶(hù)是否要加入調(diào)料。
定義模板方法模式:在一個(gè)方法中定義一個(gè)算法的框架,而將一些步驟延遲到子類(lèi)中。模板方法使得子類(lèi)可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法的某些步驟。
注:模板就是一個(gè)方法,這個(gè)方法將算法定義成一組步驟,其中的任何步驟都可以是抽象的,由子類(lèi)去實(shí)現(xiàn)。
感謝你看到這里,模板方法模式到這里就結(jié)束了,本人文筆隨便,若有不足或錯(cuò)誤之處望給予指點(diǎn),90度彎腰~~~很快我會(huì)發(fā)布下一個(gè)設(shè)計(jì)模式的內(nèi)容,生命不息,編程不止!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/67639.html
摘要:模版方法由抽象類(lèi)聲明并加以實(shí)現(xiàn)。抽象類(lèi)中的模版方法正是通過(guò)實(shí)現(xiàn)類(lèi)擴(kuò)展的方法來(lái)完成業(yè)務(wù)邏輯。一般來(lái)說(shuō),抽象類(lèi)中的模版方法是不易反生改變的部分,而抽象方法是容易反生變化的部分,因此通過(guò)增加實(shí)現(xiàn)類(lèi)一般可以很容易實(shí)現(xiàn)功能的擴(kuò)展,符合開(kāi)閉原則。 模板方法模式 定義一個(gè)操作中算法的框架,而將一些步驟延遲到子類(lèi)中,使得子類(lèi)可以不改變算法的結(jié)構(gòu)即可重定義該算法中的某些特定步驟。 模板方法模式是編程中經(jīng)...
摘要:例如,以下對(duì)兩個(gè)的相應(yīng)元素求和這個(gè)例子很好的解釋了如何構(gòu)建中所謂的迭代器代數(shù)的函數(shù)的含義。為簡(jiǎn)單起見(jiàn),假設(shè)輸入的長(zhǎng)度可被整除。接受兩個(gè)參數(shù)一個(gè)可迭代的正整數(shù)最終會(huì)在中個(gè)元素的所有組合的元組上產(chǎn)生一個(gè)迭代器。 前言 大家好,今天想和大家分享一下我的itertools學(xué)習(xí)體驗(yàn)及心得,itertools是一個(gè)Python的自帶庫(kù),內(nèi)含多種非常實(shí)用的方法,我簡(jiǎn)單學(xué)習(xí)了一下,發(fā)現(xiàn)可以大大提升工作...
摘要:目錄如何用提高效率后端掘金經(jīng)常有人說(shuō)我應(yīng)該學(xué)一門(mén)語(yǔ)言,比如之類(lèi),但是卻不知道如何入門(mén)。本文將通過(guò)我是如何開(kāi)發(fā)公司年會(huì)抽獎(jiǎng)系統(tǒng)的后端掘金需求出現(xiàn)年會(huì)將近,而年會(huì)抽獎(jiǎng)環(huán)節(jié)必不可少,但是抽獎(jiǎng)系統(tǒng)卻還沒(méi)有。 云盤(pán)一個(gè)個(gè)倒下怎么辦?無(wú)需編碼,手把手教你搭建至尊私享云盤(pán) - 工具資源 - 掘金微盤(pán)掛了,360倒了,百度云盤(pán)也立了Flag。能讓我們?cè)谠贫藘?chǔ)存分享文件的服務(wù)越來(lái)越少了。 買(mǎi)一堆移動(dòng)硬盤(pán)...
摘要:好啦,首先讓我們先搞明白基礎(chǔ)定義,到底是什么表達(dá)了中用于創(chuàng)建匿名函數(shù)的特殊語(yǔ)法。其實(shí)總結(jié)起來(lái),可以理解為一個(gè)小的匿名函數(shù),函數(shù)可以使用任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。 lambda是什么 大家好,今天給大家?guī)?lái)的是有關(guān)于Python里面的lambda表達(dá)式詳細(xì)解析。lambda在Python里面的用處很廣,但說(shuō)實(shí)話,我個(gè)人認(rèn)為有關(guān)于lambda的討論不是如何使用的問(wèn)題,而是該不該用...
閱讀 3316·2021-11-16 11:45
閱讀 4387·2021-09-22 15:38
閱讀 2841·2021-09-22 15:26
閱讀 3347·2021-09-01 10:48
閱讀 827·2019-08-30 15:56
閱讀 715·2019-08-29 13:58
閱讀 1487·2019-08-28 18:00
閱讀 2160·2019-08-27 10:53