23 模板方法模式

定義

模板方法模式(Template Method Pattern):定義一個操作中算法的框架,而將一些步驟延遲到子類中。模板方法模式使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。

結構

  1. AbstractClass(抽象類):在抽象類中定義一系列基本操作(Primitive Operations),這些基本操作可以是具體的,也可以是抽象的,每一個基本操作對應算法的一個步驟,在其子類中可以重定義或實現這些步驟。同時在抽象類中實現了一個模板方法(Template Method),用於定義一個算法框架,模板方法不僅可以調用在抽象類中實現的基本方法,也可以調用在抽象類的子類中實現的基本方法,還可以調用其他對象的方法。
  2. ConcreteClass(具體子類):它是抽象類的子類,用於實現在父類中聲明的抽象基本操作以完成子類特定算法的步驟,也可以覆蓋在父類中已經實現的具體基本操作。
模板方法模式實現
  • 模板方法

一個模板方法是定義在抽象類中的把基本操作方法組合在一起形成一個總算法或一個總行爲的方法。這個模板方法定義在抽象類中,並由子類不加修改地完全繼承下來(在Java語言中可以將模板方法定義爲final)。模板方法是一個具體方法,它給出一個頂層邏輯框架,而邏輯的組成步驟在抽象類中可以是具體方法,也可以是抽象方法。由於模板方法是具體方法,因此模板方法模式中的抽象層只能是抽象類,而不是接口。

  • 基本方法

基本方法是實現算法各個步驟的方法,是模板方法的組成部分。基本方法可以分爲3種,即抽象方法、具體方法和鉤子方法。

  1. 抽象方法:一個抽象方法有抽象類聲明、由具體子類實現。在Java語言中一個抽象方法以abstract關鍵字標識。
  2. 具體方法:一個具體方法由一個抽象類或具體類聲明並實現,其子類可以進行覆蓋也可以直接繼承。
  3. 鉤子方法:一個鉤子方法由一個抽象類或具體類聲明並實現,而其子類可能會加以擴展。通常在父類中給出的實現時一個空實現,並以該空實現作爲方法的默認實現。當然,鉤子方法可以提供一個非空的默認實現。

代碼

AbstractClass

public abstract class AbstractClass {

    // 模板方法
    public void templateMethod() {
        primitiveOperation1();
        primitiveOperation2();
        primitiveOperation3();
    }

    // 基本方法 --- 具體方法
    public void primitiveOperation1() {

    }

    // 基本方法 --- 抽象方法
    public abstract void primitiveOperation2();

    // 基本方法 --- 鉤子方法
    public void primitiveOperation3(){

    }

}

ConcreteClass

public class ConcreteClass extends AbstractClass {

    @Override
    public void primitiveOperation2() {

    }

    @Override
    public void primitiveOperation3() {
        super.primitiveOperation3();
    }

}

優/缺點與適用環境

  1. 優點
  • 在父類中形式化地定義一個算法,而由它的子類來實現細節的處理,在子類實現詳細的處理算法時並不會改變算法中步驟的執行次序。
  • 模板方法模式是一種代碼複用的技術,在類庫設計中尤爲重要,它提取了類庫中的公共行爲,將公共行爲放在父類中,而通過其子類實現不同的行爲,它鼓勵用戶恰當地使用繼承來實現代碼複用。
  • 模板方法模式可實現一種方向控制結構,用過子類覆蓋父類的鉤子方法來決定某一特定步驟是否需要執行。
  • 在模板方法模式中可以通過子類來覆蓋的基本方法,不同的子類可以提供基本方法的不同實現,更換和增加新的子類很方便,符合單一職責和開閉原則。
  1. 缺點
  • 在模板方法模式中需要爲每一個基本方法的不同實現提供一個子類,如果父類中可改變的基本方法太多,將會導致類的個數增加,系統更加龐大,設計也更加抽象,此時可結合橋接模式進行設計。
  1. 適用環境
  • 對一些複雜的算法進行分割,將其算法中固定不變的部分設計爲模板方法和父類具體方法,而一些可以改變細節由其子類來實現。即一次性實現一個算法的不變部分,並將可變的行爲留給子類實現。
  • 各子類中公共的行爲應被提取出來並集中到一個公共父類中避免代碼重複。
  • 需要通過子類來決定父類算法中的某個步驟是否執行,實現子類對父類的方向控制。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章