組件協作模式--Tmplate Method模板方法

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/w_jingjing0428/article/details/52781371

對於一個編程纔剛入門的人來說,現在來講設計模式就是趕鴨子上架的感覺,我好像Java代碼只是比小白好了那麼一點點,實在慚愧。

大家都知道設計模式有很多種,由此分類也是有很多標準,這裏是按照從封裝變化角度對模式進行分類,特此說明一下。另外,對於剛剛接觸過設計模式的人,常常會陷入泥潭,就是處處都會想着是不是可以來個模式,然而這就容易導致過度設計,又會陷入另外一個泥潭。所以設計模式就像流傳在世的武功祕籍,練得好,可以增加功力,練得不好,容易走火入魔。所以此時重構又是另外一項很重要的事。下面列舉一下重構的關鍵技法:

  • 靜態 –> 動態
  • 早綁定 –>晚綁定
  • 繼承 –> 組合
  • 編譯時依賴 –>運行時依賴
  • 緊耦合 –>鬆耦合

這篇文章主要介紹Tmplate Method模板方法。

爲啥會出現這個方法呢?從它設計的目的來看:在軟件構建的過程中,對於某一項任務,它常常有穩定的整體操作結構,但各個子步驟卻有很多改變的需求,或者由於固有的原因(比如框架和應用之間的關係)而無法和任務的整體結構同時實現。意思就是說,其實有很多的任務都是一樣的,而子步驟就可能會有不同的實現,這時爲了應對各個子步驟的變化,所以由此模板方法就出現了。

比如程序庫開發人員把庫的框架設計好之後,應用層的開發人員通常會去實現每個方法,然後去組織程序的主流程,以上結構化軟件設計的一般流程,而對於面向對象軟件設計,程序庫開發人員通常是把框架設計好,並對主程序流程也設計好,讓應用開發人員去實現各個功能,這樣如果有另外的功能加進去,或者別的開發人員也想用這個庫,就只需要關注單獨的功能任務的實現了。下面用代碼來演示一遍:

//程序庫開發人員
class Library {

    //穩定
    public void step1() {
        //...
    }

    //穩定
    public void step3() {
        //...
    }

    //穩定
    public void step5() {
        //...
    }

}

把程序庫寫好之後,應用層的程序員就要這樣寫,

//應用程序開發人員
class Application {

    //變化
    public boolean step2() {
        //...
        return true;
    }

    //變化
    public void step4() {
        //...
    }

    //穩定
    public static void main(String args[]) {

        Library lib = new Library();

        Application app = new Application();

        lib.step1();

        if (app.step2()) {
            lib.step3();
        }

        for (int i = 0; i < 4; i++) {
            app.step4();
        }

        lib.step5();
    }

}

當main方法中的主流程呈現穩定態的時候,這種寫法顯然是不利於不同功能的實現的,而且創建的類即涉及到子類又涉及到抽象類,看着不好。那我們來看看另外一種寫法,庫設計人員就提前把主流程寫好,程序員就只需要實現自己想要的個性功能。

//程序庫開發人員
abstract class Library {
    public void run() {//穩定 template method

        step1();
        if (step2()) {//支持變化 ==> 虛函數的多態調用
            step3();
        }

        for (int i = 0; i < 4; i++) {
            step4();//支持變化 ==> 虛函數的多態調用
        }

        step5();
    }


    protected void step1() {//穩定
        //...
    }

    protected void step3() {//穩定
        //...
    }

    protected void step5() {//穩定
        //...
    }

    abstract boolean step2();//變化

    abstract void step4();//變化
}

而應用開發人員就做的很簡單:

//應用程序開發人員
class Application extends Library {

    @Override
    protected boolean step2() {
        //... 子類重寫實現
        return true;
    }

    @Override
    protected void step4() {
        //... 子類重寫實現
    }

    public static void main(String args[]) {

        Library lib = new Application();
        lib.Run();

    }
}

只需要調用run方法就能完成和第一種寫法一樣的功能,而且更加的好。爲什麼好呢?第一,早綁定和晚綁定的區別,第一種方法兩個類型在編譯和運行的時候都是一樣的,這樣在編譯的時候,他們倆的行爲就已經綁定在一起了,而第二種寫法lib在編譯的時候是屬於Library類型,然而在運行的時候呈現了子類的Application特徵,所以他們倆的聯繫在運行的時候才確定,也就是晚綁定,也就是利用了java的多態性質,面試的時候我這樣解釋多態好像面試官不是特別滿意的樣子,不知道是不是我理解錯了。
看到這,模板方法通俗來說就是你不調用我,我來調用你這種反向控制,其中利用了多態性,爲很多應用程序框架提供了靈活的擴展點,是代碼複用的基本實現結構。

一點愚見。

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