編寫制作豆?jié){的程序,說明如下:
- 制作豆?jié){的流程:選材--->添加配料--->浸泡--->放到豆?jié){機(jī)打碎
- 通過添加不同的配料,可以制作出不同口味的豆?jié){
- 選材、浸泡和放到豆?jié){機(jī)打碎這幾個步驟對于制作每種口味的豆?jié){都是一樣的
- 請使用模板方法模式 完成 (說明:因?yàn)槟0宸椒J?,比較簡單, 很容易就想到這個方案,因此就直接使用,不再使用傳統(tǒng)的方案來引出模板方法模式 )
模板模式
模板模式(Template Pattern),在一個抽象類公開定義了執(zhí)行它的方法的模板。它的子類可以按需要重寫方法
實(shí)現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行。簡單說,模板方法模式定義一個操作中的算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變一個算法的結(jié)構(gòu),就可以重定義該算法的某些特定步驟。
代碼實(shí)現(xiàn)
public abstract class SoybeanMilk {
public final void make() {
select();
add();
soak();
beat();
}
void select() {
System.out.println("選擇上好的黃豆!");
}
public abstract void add();
void soak() {
System.out.println("正在泡發(fā)豆子!");
}
void beat() {
System.out.println("正在打漿!");
}
}
public class RedBeanMilk extends SoybeanMilk{
@Override
public void add() {
System.out.println("加入上好的紅豆");
}
}
public class Test {
public static void main(String[] args) {
RedBeanMilk beanMilk = new RedBeanMilk();
beanMilk.make();
}
}

模板方法模式的鉤子方法
在模板方法模式的父類中,我們可以定義一個方法,它默認(rèn)不做任何事,子類可以
視情況要不要覆蓋它,該方法稱為“鉤子”。還是用上面做豆?jié){的例子來講解,比如,我們還希望制作純豆?jié){,不添加任何的配料,請使用鉤子方法對前面的模板方法進(jìn)行改造.
public abstract class SoybeanMilk {
public final void make() {
select();
if(needAdd() == true) {
add();
}
soak();
beat();
}
void select() {
System.out.println("選擇上好的黃豆!");
}
public abstract void add();
void soak() {
System.out.println("正在泡發(fā)豆子!");
}
void beat() {
System.out.println("正在打漿!");
}
public boolean needAdd() { //鉤子方法
return true;
}
}
public class PureBeanMilk extends SoybeanMilk{
@Override
public void add() {
}
@Override
public boolean needAdd() {
return false;
}
}
public class Test {
public static void main(String[] args) {
PureBeanMilk beanMilk = new PureBeanMilk();
beanMilk.make();
}
}
模板方法模式的注意事項(xiàng)和細(xì)節(jié)
① 該方法的基本思想是: 算法只存在于一個地方,也就是在父類中,容易修改。需要修改算法時,只要修改父類的模板方法或者已經(jīng)實(shí)現(xiàn)的某些步驟,子類就會繼承這些修改實(shí)現(xiàn)了最大化代碼復(fù)用。父類的模板方法和已實(shí)現(xiàn)的某些步驟會被子類繼承而直接使用。既統(tǒng)一了算法,也提供了很大的靈活性。父類的模板方法確保了算法的結(jié)構(gòu)保持不變,同時由子類提供部分步驟的實(shí)現(xiàn)。一般模板方法都加上final關(guān)鍵字, 防止子類重寫模板方法。
② 模板方法模式使用場景:當(dāng)要完成在某個過程, 該過程要執(zhí)行一系列步驟 , 這一系列的步驟基本相同,但其個別步驟在實(shí)現(xiàn)時可能不同,通常考慮用模板方法模式來處理。
③ 該模式的不足之處:每一個不同的實(shí)現(xiàn)都需要一個子類實(shí)現(xiàn),導(dǎo)致類的個數(shù)增加,使得系統(tǒng)更加龐大。