模板模式--可復(fù)用流程的局部定制

算是讀書筆記吧

極客時間--設(shè)計模式之美


什么是模板模式

Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
模板方法模式在一個方法中定義一個算法骨架,并將某些步驟推遲到子類中實現(xiàn)。模板方法模式可以讓子類在不改變算法整體結(jié)構(gòu)的情況下,重新定義算法中的某些步驟。

舉個現(xiàn)實中的例子,在一個埋點上報的系統(tǒng)中:

  1. 基類實現(xiàn)通用的主體功能算法:
    比如新增、格式化、存儲、切割等。
  2. 子類重寫特殊的局部算法:
    比如上報(TCP/HTTP)方式、存儲的數(shù)據(jù)庫路徑等。

模板方法中通過調(diào)用抽象方法,達(dá)到定制的目的:
簡單的流程如下

插入 -- 父類實現(xiàn)
格式化 -- 父類實現(xiàn)
存儲 -- 父類實現(xiàn)
到達(dá)輪訓(xùn)時間 -- 父類實現(xiàn)
調(diào)用上報方法 -- 《《子類實現(xiàn)》》
上報完成刪除本地數(shù)據(jù) -- 父類實現(xiàn)

模板模式的作用

  1. 復(fù)用
    基類的作用是通過繼承復(fù)用模板方法(主體邏輯)
  2. 擴(kuò)展
    子類的作用是通過重寫擴(kuò)展抽象方法(特定功能)

模板模式在使用上,更傾向于指導(dǎo)如何實現(xiàn)一個高度復(fù)用流程中的局部擴(kuò)展。


經(jīng)典的模板模式

  1. 模板方法不允許子類重寫
    模板方法定義為 final,可以避免被子類重寫。
  2. 抽象方法要求子類必須實現(xiàn)
    需要子類重寫的方法定義為 abstract,可以強(qiáng)迫子類去實現(xiàn)。

這兩點主要通過編譯器檢查進(jìn)行約束
不過,在實際項目開發(fā)中,模板模式的實現(xiàn)比較靈活,以上兩點都不是必須的


Callback

通過Callback也可以實現(xiàn)可復(fù)用流程的局部定制

其本質(zhì)思想,與模板模式相同,都是在通用流程中調(diào)用定制方法。
只不過從調(diào)用抽象方法,變成了調(diào)用某個Callback

插入 -- 父類實現(xiàn)
格式化 -- 父類實現(xiàn)
存儲 -- 父類實現(xiàn)
到達(dá)輪訓(xùn)時間 -- 父類實現(xiàn)
調(diào)用上報Callback -- 《《外部傳入》》
上報完成刪除本地數(shù)據(jù) -- 父類實現(xiàn)

但是在具體實現(xiàn)技術(shù)上,二者是不同的,主要體現(xiàn)在

模板模式的擴(kuò)展性基于繼承,而Callback的擴(kuò)展性基于組合

面向?qū)ο蟮挠幸粋€思想是組合優(yōu)于繼承,在這里體現(xiàn)在:

  1. Callback可以很好的實現(xiàn)多繼承
  2. 用函數(shù)代替創(chuàng)建子類,更加輕量
  3. 不必為了一個小需求,實現(xiàn)全部的抽象方法
    由于編譯器的限制,abstract聲明的抽象方法必須全部實現(xiàn)。
    而Callback則規(guī)避了這個問題,只需要實現(xiàn)當(dāng)前需求所需的幾個抽象方法(callback)即可。

當(dāng)然,靈活的代價就是犧牲一定的可讀性,比如單一職責(zé)原則。

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

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

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