模版方法模式
定義: 在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模版方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
優點: AbstractClass中的templateMethod()擁有算法,並保護了算法,算法只存在一個地方,所以容易修改;對於子類來說,AbstractClass的存在,將代碼的複用得到了最大化。
類圖
代碼
abstract class AbstractClass {
/**
*這就是模版方法,被定義成final,以免子類改變這個算法的順序。
*/
final void templateMethod() {
//模版方法定義了一連串的步驟,每個步驟由一個方法代表。
primitiveOperation1();
primitiveOperation2();
conctreteOperation();
hook();
}
/**
*這兩個方法定義成抽象,由具體的子類實現。
*/
abstract void primitiveOperation1();
abstract void primitiveOperation2();
/**
*這個具體的方法被定義在抽象類中。
*將它聲明爲final,這樣一來子類就無法覆蓋它。
*它可以被模版方法直接調用,或者被子類使用。
*/
final void concreteOperation() {
...
}
/**
*這個一個具體的方法,但什麼事情都不做。
*這個方法被稱爲“鉤子(hook)”,子類可以視情況決定要不要覆蓋它們。
*/
void hook() {}
}
關於鉤子(hook)
使用時機: 當子類“必須”提供算法中某個方法或步驟的實現時,就使用抽象方法;如果算法的這個部分是可選的,就用鉤子。
鉤子的作用:
- 鉤子可以讓子類實現算法中可選的部分;
- 鉤子讓子類能夠有機會對模版方法中即將發生的(或剛剛發生的)步驟做出反應;
- 鉤子能夠作爲條件控制,影響AbstractClass中的算法流程。
模版方法模式、策略模式對比
模版方法: 定義一個算法的大綱,子類決定如何實現算法中的某些步驟。
策略模式: 定義一個算法家族,並讓這些算法可以互換,然後使用委託來決定要採用哪一個算法。策略模式使用對象組合,所組合的類實現了整個算法。