一. 定義:
模版方法模式:定義一個操作中的算法的框架,而將一些步驟延遲道子類中。使得子類可疑不改變一個算法的結構即可重定義該算法的某些特定步驟。
模版方法模式使用了java的繼承機制。
abstractClass(抽象模版):
它的方法分爲兩類:(1)基本方法(基本操作):由子類實現的方法,並且在模版方法被調用;
(2)模版方法:可以有一個或幾個,一般是一個具體的方法,也就是一個框架,實現對基本方法的調度,完成固定的邏輯。(爲了防止惡意操作,一般模版方法都加上inal關鍵字,不允許被覆寫)。
concreteClass(具體模版):實現父類所定義的一個或多個抽象方法,也就是父類定義的基本方法在子類中得以實現。
/** * 抽象模板類 **/ public abstract class AbstractClass { /** * 基本方法 */ protected abstract void doSomething(); /** * 基本方法 */ protected abstract void doAnything(); /** * 模板方法 */ public void templateMethod() { // 調用基本方法,完成相關邏輯 this.doAnything(); this.doSomething(); } }
/** * 具體模板類 */ public class ConcreteClass1 extends AbstractClass { /** * 實現基本方法 */ @Override protected void doSomething() { // 業務邏輯處理 } /** * */ @Override protected void doAnything() { // 業務邏輯處理 } }
/** * 具體模板類 */ public class ConcreteClass2 extends AbstractClass { /** * 實現基本方法 */ @Override protected void doSomething() { // 業務邏輯處理 } /** * */ @Override protected void doAnything() { // 業務邏輯處理 } }
public class Client { public static void main(String[] args) { AbstractClass class1 = new ConcreteClass1(); AbstractClass class2 = new ConcreteClass2(); // 調用模板方法 class1.templateMethod(); class2.templateMethod(); } }
二. 模版方法模式優缺點:
模版方法模式優點:
-- 封裝不變部分,擴展可變部分;
-- 提取公共部分代碼,便於維護;
-- 行爲由父類控制,子類實現。
模版方法模式缺點:
-- 按照設計習慣,抽象類負責聲明最抽象、最一般的事物屬性和方法,實現類完成具體的事物屬性和方法。但是模板模式卻顛倒了,抽象類定義了部分抽象方法,由子類實現,子類執行結果影響了父類的結果,也就是子類對父類產生了影響,在複雜項目中會帶來代碼閱讀難度。
三. 模版方法模式的使用場景及注意事項
1.使用場景:
-- 多個子類有公有的方法,並且邏輯基本相同;
-- 重要、複雜的算法,可以把核心算法設計爲模板方法,周邊的相關細節功能則由各個子類實現;
-- 重構時,模板方法模式是一個經常使用的模式,把相同的代碼抽取到父類中,然後通過鉤子函數約束其行爲。