Java設計模式之模板模式

模板模式:定義一個算法的框架,將一些方法由子類實現。簡單說,就是爲子類設計一套執行流程,以便子類可以複用這套流程。
模板模式由抽象父類和子類構成,父類中包含:

  • 模板方法(定義執行流程,子類調用)
  • 抽象方法(子類必須實現)
  • 鉤子方法(微調模板方法的執行流程,子類可選擇重寫或不重寫)
  • 具體方法(子類不可重寫)
    下面以學生考試爲例,具體介紹模板模式:
    定義抽象父類:
public abstract class Exam {

    public void answerOrder() {
        choiceQuestion();
        shortAnswerQuestion();
        if (doAdditionalQuestions()) {
            additionalQuestions();
        }
        commitPaper();
    }

    private void choiceQuestion() {
        System.out.println("先做選擇題");
    }

    private void shortAnswerQuestion() {
        System.out.println("再做簡答題");
    }

    private void additionalQuestions() {
        System.out.println("最後做附加題");
    }

    protected boolean doAdditionalQuestions() {
        return true;
    }

    abstract void commitPaper();

}

定義子類:

public class MyExam extends Exam {

    private boolean doAdditional;

    public MyExam(boolean doAdditional) {
        this.doAdditional = doAdditional;
    }

    @Override
    void commitPaper() {
        System.out.println("提前交卷");
    }

    @Override
    protected boolean doAdditionalQuestions() {
        return doAdditional;
    }
}

定義業務類:

public class Test {
    public static void main(String[] args) {
        Exam myexam = new MyExam(false);
        myexam.answerOrder();
    }
}
先做選擇題
再做簡答題
提前交卷

我們都知道,考試中我們都有固定的答題順序,一般是先做選擇,再做簡答,附加題可做可不做,最後我們決定準時交卷還是提前交卷。所以在父類的模板方法中,我們定義了一系列的執行流程,並提供鉤子方法讓子類重寫來決定是否做附加題,還提供了抽象方法讓子類實現必須交卷的方法。
模板模式的要點在於複用抽象類的公共方法,重寫抽象類中的抽象方法,選擇性使用抽象類的鉤子方法。
總結一句話:子類可以重寫父類中允許改變的邏輯。
模板模式可以提高代碼的擴展性,父類控制流程,子類實現具體流程,符合開閉原則。

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