定義:在父類中定義處理流程的框架,在子類中實現具體的處理就成爲模板方法模式(Template Method),
假設我們制定一個木偶的流程,我們想要一個做胖木偶的類,還有一個做瘦木偶的類,每個類的方法都差不多,只是具體的實現有所不同,這時我們就可以用模板方法模式,類圖如下:
我們在AbstractPerson類中定義了製作玩偶的流程(在createPerson中去調用abstract方法head、body、arms、legs分別去創建玩偶的頭、身體、胳膊、腿),而在子類中去做具體的實現,具體實現如下:
public abstract class AbstractPerson {
protected String head;
protected String body;
protected String arms;
protected String legs;
abstract void head();
abstract void body();
abstract void arms();
abstract void legs();
final void createPerson(){
head();
body();
arms();
legs();
System.out.println(head + "," + body + "," + arms + "," + legs + "創建成功!");
}
}
public class FatPerson extends AbstractPerson {
void head() {
head = "大圓臉";
}
void body() {
body = "大肚子";
}
void arms() {
arms = "圓胳膊";
}
void legs() {
legs = "大粗腿";
}
}
public class ThinPerson extends AbstractPerson {
void head() {
head = "瓜子臉";
}
void body() {
body = "A4腰";
}
void arms() {
arms = "細胳膊";
}
void legs() {
legs = "大長腿";
}
}
如上所示,抽象類AbstractPerson類只負責具體的流程指定,而實現類FatPerson和ThinPerson分別對流程進行了具體的實現。
下面進行測試
public class Main {
public static void main(String[] args){
AbstractPerson fatPerson = new FatPerson();
AbstractPerson thinPerson = new ThinPerson();
fatPerson.createPerson();
thinPerson.createPerson();
}
}
結果
那麼用模板方法的模式有什麼好處呢?
1. 可以在抽象類中定義每個處理的節點,防止遺漏,如果自己實現,不小心某個類忘記了head方法就不好了。
2. 可以讓子類只關心具體方法的實現,而不用管這些方法的調用順序。如果有些方法一定要按照嚴格的順序調用,用模板方法實現也是個不錯的選擇。
3. 調用時引用可以用抽象類,無論父類的對象中保存哪個子類的實例,程序都可以正常運行,這種原則稱爲里氏替換原則。
模板方法模式屬於行爲型設計模式,劃分了責任和算法