軟件設計模式學習(二十六)模板方法模式


模板方法是結構最簡單的行爲型設計模式,在抽象類中定義了一個稱爲模板方法的方法,在這個方法中定義其餘基本方法的執行步驟,而基本方法的實現能夠放在抽象類,也能夠放在其子類java


模式動機

現實生活中不少事情的完成過程都包含幾個基本步驟,例如請客吃飯,不管吃什麼,通常都包含點單、吃東西、買單幾個步驟,到底吃什麼則具體狀況具體分析,在實際環境中由用戶動態決定。算法

既然這幾個步驟的次序是固定的,因而咱們建立一個新的方法叫「請客」,在其中調用了點單、吃東西和買單,同時指定它們的執行次序,咱們稱這個「請客」爲模板方法,「點單」、「吃東西」、「買單」都是「請客」過程當中的一個步驟,它們稱爲基本方法。其中「吃東西」能夠有多種吃法,如吃飯、吃麪條、吃燒烤,所以須要提供不一樣的「吃東西」方法的實現。設計模式

假設用代碼實現上述方法,咱們能夠把相同代碼放在父類,如「點單」和「買單」,而將不一樣方法實現放在不一樣的子類,如「吃東西」,這樣一來提升了代碼的複用性,還能夠利用面向對象的多態性,這就是模板方法模式的模式動機。設計


模式定義

定義一個操做中算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類能夠不改變一個算法的結構便可從新定義該算法的某些特定步驟code

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.對象


模式分析

模板方法模式是基於繼承的代碼複用基本技術,先在抽象類的模板方法中指定執行步驟,將相同步驟對應的方法在抽象父類中實現,而不一樣的步驟只在抽象父類中進行聲明。因爲面向對象的多態性,子類中定義的方法將覆蓋父類中定義的方法,所以程序運行時,具體子類的基本方法將覆蓋父類中定義的基本方法,實現特定的算法。blog

不過,雖說子類覆蓋了父類的方法實現業務邏輯,但其實是由父類來控制整個過程,即子類不須要調用父類,而經過父類來調用子類。繼承

由此得模式結構類圖以下:同步

抽象類(AbstractClass)中定義一系列基本操做(primitiveOperation),這些基本操做能夠是具體的,也能夠是抽象的,每個基本操做對應算法的一個步驟,在其子類中能夠重定義並實現一個算法的各個步驟。同時在抽象類中實現了一個模板方法(templateMethod),用於定義一個算法的骨架,調用基本操做。it

具體子類(ConcreteClass)用於實如今父類中定義的抽象基本操做以完成子類特定算法的步驟,也能夠覆蓋在父類中實現的具體基本操做。

基本方法是實現各個步驟的方法,是模板方法的組成部分,基本方法又能夠分爲三種:

  • 抽象方法

    一個抽象方法由抽象類聲明,由其具體子類實現

  • 具體方法

    一個具體方法由一個抽象類或具體類聲明並實現,其子類能夠進行覆蓋

  • 鉤子方法

    一個鉤子方法由一個抽象類或具體類聲明並實現,而其子類可能會加以擴展。一般在父類中給出的實現是一個空實現,做爲該方法的默認實現,固然也能夠提升一個非空的默認實現。

    鉤子方法有兩類,一類是能夠控制具體步驟的執行,好比說咱們但願在不一樣條件下執行模板方法中的不一樣步驟,就能夠定義一個返回類型爲布爾值的鉤子方法,用於進行條件判斷,若是條件知足則執行某一步驟,不然某一步驟不執行

    public void template() {
        open();
        display();
        if(isPrint()) {
            print();
        }
    }
    
    public boolean isPrint(){
        return true;
    }

    若是不但願方法執行,能夠在其子類在覆蓋鉤子方法,修改返回值便可。

    還有一類鉤子方法是實現體爲空的具體方法,子類根據須要覆蓋或繼承它們,與抽象方法相比,鉤子方法的好處在於若是沒有覆蓋父類中定義的抽象方法,編譯仍能夠經過。


模式優缺點

模板方法模式的優勢:

  • 能夠在一個類中形式化地定義算法,而由它的子類實現細節的處理
  • 模板方法模式是一種代碼複用的基本技術,在類庫設計中尤爲重要,它提取類庫中的公共行爲,將公共行爲放在父類,經過子類來實現不一樣的行爲
  • 經過一個父類調用其子類的操做,經過對子類的擴展增長新的行爲,符合開閉原則

模板方法模式的缺點:

  • 每一個不一樣的實現都須要定義一個子類,將會致使類的個數增長
相關文章
相關標籤/搜索