模板模式--可複用流程的局部定製

算是讀書筆記吧

極客時間--設計模式之美


什麼是模板模式

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.
模板方法模式在一個方法中定義一個算法骨架,並將某些步驟推遲到子類中實現。模板方法模式可以讓子類在不改變算法整體結構的情況下,重新定義算法中的某些步驟。

舉個現實中的例子,在一個埋點上報的系統中:

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

模板方法中通過調用抽象方法,達到定製的目的:
簡單的流程如下

插入 -- 父類實現
格式化 -- 父類實現
存儲 -- 父類實現
到達輪訓時間 -- 父類實現
調用上報方法 -- 《《子類實現》》
上報完成刪除本地數據 -- 父類實現

模板模式的作用

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

模板模式在使用上,更傾向於指導如何實現一個高度複用流程中的局部擴展。


經典的模板模式

  1. 模板方法不允許子類重寫
    模板方法定義爲 final,可以避免被子類重寫。
  2. 抽象方法要求子類必須實現
    需要子類重寫的方法定義爲 abstract,可以強迫子類去實現。

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


Callback

通過Callback也可以實現可複用流程的局部定製

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

插入 -- 父類實現
格式化 -- 父類實現
存儲 -- 父類實現
到達輪訓時間 -- 父類實現
調用上報Callback -- 《《外部傳入》》
上報完成刪除本地數據 -- 父類實現

但是在具體實現技術上,二者是不同的,主要體現在

模板模式的擴展性基於繼承,而Callback的擴展性基於組合

面向對象的有一個思想是組合優於繼承,在這裏體現在:

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

當然,靈活的代價就是犧牲一定的可讀性,比如單一職責原則。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章