算是讀書筆記吧
極客時間--設(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)中:
- 基類實現(xiàn)通用的主體功能算法:
比如新增冗美、格式化、存儲掸屡、切割等封寞。 - 子類重寫特殊的局部算法:
比如上報(TCP/HTTP)方式、存儲的數(shù)據(jù)庫路徑等仅财。
模板方法中通過調(diào)用抽象方法狈究,達到定制的目的:
簡單的流程如下
插入 -- 父類實現(xiàn)
格式化 -- 父類實現(xiàn)
存儲 -- 父類實現(xiàn)
到達輪訓(xùn)時間 -- 父類實現(xiàn)
調(diào)用上報方法 -- 《《子類實現(xiàn)》》
上報完成刪除本地數(shù)據(jù) -- 父類實現(xiàn)
模板模式的作用
- 復(fù)用
基類
的作用是通過繼承復(fù)用
模板方法(主體邏輯) - 擴展
子類
的作用是通過重寫擴展
抽象方法(特定功能)
模板模式在使用上,更傾向于指導(dǎo)如何實現(xiàn)一個高度復(fù)用流程中的局部擴展盏求。
經(jīng)典的模板模式
- 模板方法不允許子類重寫
模板方法定義為final
抖锥,可以避免被子類重寫。 - 抽象方法要求子類必須實現(xiàn)
需要子類重寫的方法定義為abstract
碎罚,可以強迫子類去實現(xiàn)磅废。
這兩點主要通過編譯器檢查進行約束
不過,在實際項目開發(fā)中荆烈,模板模式的實現(xiàn)比較靈活拯勉,以上兩點都不是必須的
Callback
通過Callback也可以實現(xiàn)可復(fù)用流程的局部定制
其本質(zhì)思想,與模板模式相同憔购,都是在通用流程中調(diào)用定制方法谜喊。
只不過從調(diào)用抽象方法
,變成了調(diào)用某個Callback
插入 -- 父類實現(xiàn)
格式化 -- 父類實現(xiàn)
存儲 -- 父類實現(xiàn)
到達輪訓(xùn)時間 -- 父類實現(xiàn)
調(diào)用上報Callback -- 《《外部傳入》》
上報完成刪除本地數(shù)據(jù) -- 父類實現(xiàn)
但是在具體實現(xiàn)技術(shù)上倦始,二者是不同的,主要體現(xiàn)在
模板模式的擴展性基于
繼承
山卦,而Callback的擴展性基于組合
面向?qū)ο蟮挠幸粋€思想是組合優(yōu)于繼承鞋邑,在這里體現(xiàn)在:
- Callback可以很好的實現(xiàn)多繼承
- 用函數(shù)代替創(chuàng)建子類,更加輕量
-
不必為了一個小需求账蓉,實現(xiàn)全部的抽象方法
由于編譯器的限制枚碗,abstract
聲明的抽象方法必須全部實現(xiàn)。
而Callback則規(guī)避了這個問題铸本,只需要實現(xiàn)當(dāng)前需求所需的幾個抽象方法(callback)即可肮雨。
當(dāng)然,靈活的代價就是犧牲一定的可讀性箱玷,比如單一職責(zé)原則怨规。