代碼文件目錄:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-655335.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-655335.html
CaffeineBeverage
package Chapter8_TemplateMethodPattern;
/**
* @Author 竹心
* @Date 2023/8/17
**/
public abstract class CaffeineBeverage {
final void prepareRecipe(){
boilWater();
brew();
pourInCup();
//這里使用鉤子customerWantsCondiments()來(lái)讓子類在算法過(guò)程中介入
if(customerWantsCondiments()){
addCondiments();
}
}
abstract void brew();//沖泡
abstract void addCondiments();//添加配料
void boilWater(){
//如果不想子類更改這些方法的實(shí)現(xiàn),可以使用final
System.out.println("Boiling Water!");
}
void pourInCup(){
System.out.println("Pouring into cup");
}
//添加掛鉤
boolean customerWantsCondiments(){
return true;
}
}
Coffee
package Chapter8_TemplateMethodPattern;
/**
* @Author 竹心
* @Date 2023/8/17
**/
public class Coffee extends CaffeineBeverage{
public void brew() {
System.out.println("Dripping Coffee through filter!");
}
public void addCondiments(){
System.out.println("Adding Sugar and Milk!");
}
public boolean customerWantsCondiments(){
//這里實(shí)行相關(guān)代碼決定客戶是否需要添加配料
return true;
}
}
Tea
package Chapter8_TemplateMethodPattern;
/**
* @Author 竹心
* @Date 2023/8/17
**/
public class Tea extends CaffeineBeverage{
public void brew(){
System.out.println("Steeping the tea!");
}
public void addCondiments(){
System.out.println("Adding Lemon!");
}
public boolean customerWantsCondiments(){
//這里實(shí)行相關(guān)代碼決定客戶是否需要添加配料
return true;
}
}
notes
模板方法模式
案例:
咖啡和茶這兩種飲料的制作方法如下:
1.把水煮沸
2.把咖啡粉末(茶葉)加入水中
3.把咖啡(茶)倒進(jìn)杯子
4.添加配料(檸檬、糖、奶等)
其中只有第2、4步是有所不同的(但也僅僅是涉及的對(duì)象不同),所以將四個(gè)步驟
抽取出來(lái)作為父類CaffeineBeverage中的方法,然后在父類中實(shí)現(xiàn)1、3兩個(gè)步驟,
而2、4則由其子類(Tea, Coffee)來(lái)實(shí)現(xiàn)
模板方法:定義一個(gè)算法步驟,允許子類提供一個(gè)或者多個(gè)步驟的實(shí)現(xiàn)。
優(yōu)點(diǎn):
1.提高代碼復(fù)用
2.可以在不改變算法結(jié)構(gòu)的情況下,重新定義算法中的某些步驟,可維護(hù)性好(用案例來(lái)說(shuō),
就是如果要添加新的飲料,可以直接繼承該父類,實(shí)現(xiàn)其獨(dú)特的原料配方即可)
好萊塢原則:
高層組件主動(dòng)決定控制底層組件,但是底層組件絕對(duì)不能調(diào)用高層組件。
模板方法模式(還有工廠模式、觀察者模式)采用了這一原則
模板方法模式的應(yīng)用:
常用的Arrays.sort()方法就涉及到模板方法模式,sort()可以對(duì)所有的對(duì)象數(shù)組
進(jìn)行排序,前提是該數(shù)組的對(duì)象類型實(shí)行了接口Comparable下的compareTo()
方法。這里的sort()就是模板方法中的模板(遵循了模板方法模式的原則)。
到了這里,關(guān)于《HeadFirst設(shè)計(jì)模式(第二版)》第八章代碼——模板方法模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!