設計模式_模板方法模式(Java)

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

舉個栗子:小明想在學習過後去運動或者上會網,那麼小明在學習某門課程過後一定會搞點事情,而這些事情是可變化的,誰也不知道他要幹什麼,所以我們需要在它需要的時候進行“實現”。

類圖

模板方法

示例代碼

//package com.dlut.designpattern.template;

public abstract class AbstractClass {
    public void beforeLearn(){};//鉤子方法
    public abstract void learn();
    public abstract void afterLearn();

    public final void TemplateMethod(){
        beforeLearn();
        learn();
        afterLearn();
    }
}

class ExerciseAfterLearn extends AbstractClass{
    public void learn() {
        System.out.println("學英語:A,B,C...");
    }
    public void afterLearn() {
        System.out.println("打籃球去...");
    }
}

class InternetAfterLearn extends AbstractClass{
    public void beforeLearn(){
        System.out.println("預習化學...");
    }
    public void learn() {
        System.out.println("學化學:氫氦鋰鈹硼...");
    }
    public void afterLearn() {
        System.out.println("刷刷微博...");
    }
}
public class Client {
    public static void main(String[] args) {
        AbstractClass ac=new ExerciseAfterLearn();
        ac.TemplateMethod();
        ac=new InternetAfterLearn();
        ac.TemplateMethod();
    }
}

輸出結果:

學英語:A,B,C…
打籃球去…
預習化學…
學化學:氫氦鋰鈹硼…
刷刷微博…

在代碼中,我們可以看到一個新的概念:鉤子方法。

鉤子方法:由一個抽象類或具體類聲明並實現,而其子類可能會加以擴展。通常在父類中給出的實現是一個空實現,並以該空實現作爲方法的默認實現,當然鉤子方法也可以提供一個非空的默認實現。
這樣使得我們的模式有了一定的可擴展性。

模版方法:由抽象類聲明並加以實現。一般來說,模版方法調用抽象方法來完成主要的邏輯功能,並且,模版方法大多會定義爲final類型,指明主要的邏輯功能在子類中不能被重寫。

模板方法模式也有其缺點:需要爲每一個基本方法的不同實現提供一個子類,如果父類中可變的基本方法太多,將會導致類的個數呈爆炸型增長,設計也更加抽象。此時,可結合橋接模式來進行設計。

參考:

發佈了52 篇原創文章 · 獲贊 35 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章