第八章 模版方法模式

模版方法模式

定義: 在一個方法中定義一個算法的骨架,而將一些步驟延遲到子類中。模版方法使得子類可以在不改變算法結構的情況下,重新定義算法中的某些步驟。
優點: AbstractClass中的templateMethod()擁有算法,並保護了算法,算法只存在一個地方,所以容易修改;對於子類來說,AbstractClass的存在,將代碼的複用得到了最大化。

類圖

代碼

abstract class AbstractClass {

    /**
     *這就是模版方法,被定義成final,以免子類改變這個算法的順序。
     */
    final void templateMethod() {
        //模版方法定義了一連串的步驟,每個步驟由一個方法代表。
        primitiveOperation1();
        primitiveOperation2();
        conctreteOperation();
        hook();
    }

    /**
     *這兩個方法定義成抽象,由具體的子類實現。
     */
    abstract void primitiveOperation1();
    abstract void primitiveOperation2();

     /**
     *這個具體的方法被定義在抽象類中。
     *將它聲明爲final,這樣一來子類就無法覆蓋它。
     *它可以被模版方法直接調用,或者被子類使用。
     */
    final void concreteOperation() {
        ...
    }

    /**
     *這個一個具體的方法,但什麼事情都不做。
     *這個方法被稱爲“鉤子(hook)”,子類可以視情況決定要不要覆蓋它們。
     */
    void hook() {}

}

關於鉤子(hook)

使用時機: 當子類“必須”提供算法中某個方法或步驟的實現時,就使用抽象方法;如果算法的這個部分是可選的,就用鉤子
鉤子的作用:
- 鉤子可以讓子類實現算法中可選的部分;
- 鉤子讓子類能夠有機會對模版方法中即將發生的(或剛剛發生的)步驟做出反應;
- 鉤子能夠作爲條件控制,影響AbstractClass中的算法流程。

模版方法模式、策略模式對比

模版方法: 定義一個算法的大綱,子類決定如何實現算法中的某些步驟
策略模式: 定義一個算法家族,並讓這些算法可以互換,然後使用委託來決定要採用哪一個算法。策略模式使用對象組合,所組合的類實現了整個算法

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