From Now On,Let us begin Design Patterns。
模板方法模式
定義
- 定義一個操作中的算法的框架,而將一些步驟延遲到子類中。使用子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。 Define the skeleton of an algorithm in anoperation, deferring some steps to subclasses. Template Method lets subclassesredefine certain steps of an algorithm without changing the algorithm’sstructure.
模板方法模式很簡單,僅僅使用了Java的繼承機制,但它是一個應用非常廣泛的模式。其中AbstractClass叫做抽象模板,它的方法分爲三類:
1. 基本方法:是由子類來實現的方法,並且在模板方法被調用(一般多個)
2. 模板方法:可以有一個或幾個,一般是一個具體方法,也就是一個框架,實現對基本方法的調度,完成固定的邏輯。
3. 鉤子方法:提供給子類適當的能力更改父類模板方法的邏輯。
注意:爲了防止惡意的操作,一般模板方法都加上final關鍵字,不允許被覆寫。
通用類圖:
通用源碼實現如下:
模板方法模式的優點:
封裝不變部分,擴展可變部分(可擴展性)
把認爲不變部分的算法封裝到父類實現,而可變部分的則可以通過繼承來繼續擴展;提取公共部分代碼,便於維護(可維護性)
不要讓維護人員到處查找相似的代碼;行爲由父類控制,子類實現,同時提供鉤子方法供子類實現可選邏輯
基本方法是由子類實現的,因此子類可以通過擴展的方式增加相應的功能,符合開閉原則。
模板方法模式的缺點:
- 按設計習慣,抽象類負責聲明最抽象、最一般的事物屬性與方法,實現類完成具體事物屬性和方法。但模板方法卻反了:抽象類定義了部分抽象方法,由子類來實現,子類執行的結果影響了父類的結果,也就是子類對父類產生了影響,在複雜項目中,會帶來代碼閱讀的困難。對新手產生不適。
模板方法模式的使用場景:
多個子類有公有的方法,並且邏輯基本相同時。
重要、複雜的算法,可以把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現。
重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然後通過鉤子函數來約束其行爲。
模板方法模式的注意事項:
抽象模板中的基本方法儘量設計爲protected類型,符合迪米特法則,不需要暴露的屬性或方法儘量不要設置爲protected類型。實現類若非必要,儘量不要擴大父類中的訪問權限。
此也是一種較好的父類調用子類方法的方式
模板方法模式的例子:
源代碼:
模板類:
子類1:
子類2:
運行結果: