模板方法模式

模板方法模式

模板方法模式: 在一個(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 的用法&目的

  1. Hook可以讓子類實(shí)現(xiàn)算法中的『可選』部分。
  2. 讓子類有機(jī)會(huì)對(duì)模板方法中某些即將發(fā)生的(或剛剛發(fā)生的)步驟做出反應(yīng)。
  3. 鉤子也可以讓子類有能力為其抽象類做一些決定。

Java中數(shù)組的 Arrays.sort([]) 方法就是模板方法。

要點(diǎn)

  1. 模板方法定義了算法的步驟,把這些步驟的實(shí)現(xiàn)延遲到了子類。
  2. 模板方法為我們提供了一種代碼復(fù)用的重要技巧。
  3. 模板方法的抽象類可以定義具體方法、抽象方法和鉤子。
  4. 抽象方法由子類實(shí)現(xiàn)。
  5. 鉤子是一種方法,它在抽象類中不做事,或者只做默認(rèn)的事情,子類可以選擇要不要去覆蓋它。
  6. 為了防止子類改變模板方法中的算法,可以將模板方法聲明為final
  7. 好萊塢原則告訴我們,將決策權(quán)放在高層模塊中,以便決定如何以及何時(shí)調(diào)用低層模塊。
  8. 你將在真實(shí)世界代碼中看到模板方法模式的許多變體,不要期待它們?nèi)际且谎劬涂梢员荒阏J(rèn)出的。
  9. 策略模式和模板模式都封裝算法,一個(gè)用組合,一個(gè)用繼承。
  10. 工廠方法是模板方法的一個(gè)特殊版本。

小結(jié)

模板方法更側(cè)重在『模板』二字,它需要做的是定義一個(gè)算法的『大綱』,它的子類去實(shí)現(xiàn)的是這個(gè)『大綱』里的幾個(gè)步驟,算法的結(jié)構(gòu)維持不變。

模板方法對(duì)算法的控制權(quán)更大一些,但是由于模板方法使用的是 繼承,并且父類中有實(shí)現(xiàn),所以子類會(huì)依賴父類中的實(shí)現(xiàn),缺乏了點(diǎn)彈性。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容