模板方法模式
模板方法模式: 在一個(gè)方法中定義一個(gè)算法的估價(jià),而將一些步驟延遲到子類中。模板方法使得子類可以在不改變方法結(jié)構(gòu)的情況下,重新定義算法的某些步驟。

具體來說:
創(chuàng)建一個(gè)算法的模板,這個(gè)模板其實(shí)就是第一個(gè)方法(需要定義為final)。而這個(gè)方法將算法定義成一組步驟,其中的任何步驟都可以是抽象的,由子類負(fù)責(zé)實(shí)現(xiàn)。這樣可以確保算法結(jié)構(gòu)保持不變,同時(shí)由子類提供部分實(shí)現(xiàn)。
模板方法模式用來封裝算法。
Hook
BONUS TIME!
hook()(鉤子)指那些 『默認(rèn)不做事的方法』,子類可以視情況決定要不要覆蓋它們。
鉤子 是 『一種被聲明在抽象類中的方法,但只有空的或者默認(rèn)的實(shí)現(xiàn)』。
鉤子的存在,可以讓子類有能力對(duì)算法的不同點(diǎn)就行掛鉤。要不要掛鉤,由子類自行決定。
其實(shí)Hook并不高端,在實(shí)際中有很多運(yùn)用,比如在BaseActivity里配置一些東西的時(shí)候,留幾個(gè)有默認(rèn)返回值的方法做為某個(gè)功能的開關(guān),比如:是否能側(cè)滑返回等。
//...
if(canSwipeBack()){
setupSwipeBack();
}
//...
protected boolean canSwipeBack(){
return true;
}
Hook 的用法&目的
- Hook可以讓子類實(shí)現(xiàn)算法中的『可選』部分。
- 讓子類有機(jī)會(huì)對(duì)模板方法中某些即將發(fā)生的(或剛剛發(fā)生的)步驟做出反應(yīng)。
- 鉤子也可以讓子類有能力為其抽象類做一些決定。
Java中數(shù)組的 Arrays.sort([]) 方法就是模板方法。
要點(diǎn)
- 模板方法定義了算法的步驟,把這些步驟的實(shí)現(xiàn)延遲到了子類。
- 模板方法為我們提供了一種代碼復(fù)用的重要技巧。
- 模板方法的抽象類可以定義具體方法、抽象方法和鉤子。
- 抽象方法由子類實(shí)現(xiàn)。
- 鉤子是一種方法,它在抽象類中不做事,或者只做默認(rèn)的事情,子類可以選擇要不要去覆蓋它。
- 為了防止子類改變模板方法中的算法,可以將模板方法聲明為
final - 好萊塢原則告訴我們,將決策權(quán)放在高層模塊中,以便決定如何以及何時(shí)調(diào)用低層模塊。
- 你將在真實(shí)世界代碼中看到模板方法模式的許多變體,不要期待它們?nèi)际且谎劬涂梢员荒阏J(rèn)出的。
- 策略模式和模板模式都封裝算法,一個(gè)用組合,一個(gè)用繼承。
- 工廠方法是模板方法的一個(gè)特殊版本。
小結(jié)
模板方法更側(cè)重在『模板』二字,它需要做的是定義一個(gè)算法的『大綱』,它的子類去實(shí)現(xiàn)的是這個(gè)『大綱』里的幾個(gè)步驟,算法的結(jié)構(gòu)維持不變。
模板方法對(duì)算法的控制權(quán)更大一些,但是由于模板方法使用的是 繼承,并且父類中有實(shí)現(xiàn),所以子類會(huì)依賴父類中的實(shí)現(xiàn),缺乏了點(diǎn)彈性。