《Head First 設計模式》 模板方法模式

2021-10-24 02:30:49 字數 2325 閱讀 7591

模板方法模式在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟。

要點:

模板方法一般宣告為 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設計模式之模板方法模式

在乙個方法中定義乙個演算法的骨架,而將一些步驟延遲到子類中,使得子類可以不改變演算法結構的情況下,重定義該演算法中的某些特定步驟。比較通俗的說法,子類決定如何實現演算法中的某些步驟,比如兩個一連串的操作,操作次序是一樣的,有的操作相同,有的不同,將兩個連串操作抽象出父類 子類在相同次序,但具體方法不...