模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。
要點:
模板方法一般宣告為 final,以免子類改變演算法的步驟。
抽象類中,可以宣告一些鉤子方法,子類視情況決定要不要覆蓋它們。鉤子的存在,可以讓子類有能力對演算法的不同點進行掛鉤,使得模板方法更具有彈性。
/**
* 抽象類
*/public abstract class abstractclass
/*** 步驟1
*/public abstract void step1();
/*** 步驟2
*/public abstract void step2();
/*** 步驟3
*/public abstract void step3();
/*** 公共步驟
*/private void commonstep()
/*** 鉤子方法
*/public void hook()
}
(1)具體子類a/**
* 具體子類a
*/public class concreteclassa extends abstractclass
@override
public void step2()
@override
public void step3()
@override
public void hook()
}
(2)具體子類b/**
* 具體子類b
*/public class concreteclassb extends abstractclass
@override
public void step2()
@override
public void step3()
}
public class test
}
《星巴茲咖啡師傅訓練手冊》規定了,準備星巴茲飲料時,必須精確地遵循下面的沖泡法:
星巴茲咖啡沖泡法:
把水煮沸
用沸水沖泡咖啡
把咖啡倒進杯子
加糖和牛奶
星巴茲茶沖泡法:
把水煮沸
用沸水浸泡茶葉
把茶倒進杯子
加檸檬
現在,讓我們扮演「**師傅」,寫一些**來建立咖啡和茶。
(1)建立咖啡因飲料抽象類,並定義沖泡步驟的方法
/**
* 咖啡因飲料抽象類
*/public abstract class caffeinebeverage
}/**
* 沖泡(依賴於子類的步驟)
*/abstract void brew();
/*** 新增調料(依賴於子類的步驟)
*/abstract void addcondiments();
/*** 燒水(公共步驟)
*/void boilwater()
/*** 把飲料倒進杯子(公共步驟)
*/void pourincup()
/*** 顧客是否想要新增調料(鉤子方法)
*/boolean customerwantscondiments()
}
(2)建立具體的飲料,並提供具體沖泡步驟的實現/**
* 咖啡
*/public class caffee extends caffeinebeverage
@override
void addcondiments()
@override
boolean customerwantscondiments() else
}/**
* 詢問顧客
*/private string askcustomer()
scanner.close();
if (answer == null)
return answer;
}}
/**
* 茶*/public class tea extends caffeinebeverage
@override
void addcondiments()
}
(3)沖泡飲料public class test
}
HeadFirst設計模式 模板方法模式
設定泡咖啡和泡茶兩個類,步驟如下 放水放咖啡 茶 步驟1是共有的。可以設定乙個抽象類,實現方法1,定義方法2並由子類實現。乙個例子就是對物件進行sort,sort裡的compareto方法由物件自己定義。模板方法模式可以設定鉤子方法。比如init stop destroy時設定響應的鉤子但不實現或使...
HeadFirst 設計模式 8模板方法模式
模板方法模式 在乙個方法中定義乙個演算法的骨架,並將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。增加乙個hook 方法後 注意 此處的hook 鉤子 是一種被宣告在抽象類中的方法,但是只有空的或缺省的實現。hook 的存在可以讓子類能夠對演算法的...
Head First設計模式之模板方法模式
在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變演算法結構的情況下,重定義該演算法中的某些特定步驟。比較通俗的說法,子類決定如何實現演算法中的某些步驟,比如兩個一連串的操作,操作次序是一樣的,有的操作相同,有的不同,將兩個連串操作抽象出父類 子類在相同次序,但具體方法不...