模板模式:定義一個算法的框架,將一些方法由子類實現。簡單說,就是爲子類設計一套執行流程,以便子類可以複用這套流程。
模板模式由抽象父類和子類構成,父類中包含:
- 模板方法(定義執行流程,子類調用)
- 抽象方法(子類必須實現)
- 鉤子方法(微調模板方法的執行流程,子類可選擇重寫或不重寫)
- 具體方法(子類不可重寫)
下面以學生考試爲例,具體介紹模板模式:
定義抽象父類:
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();
}
}
先做選擇題
再做簡答題
提前交卷
我們都知道,考試中我們都有固定的答題順序,一般是先做選擇,再做簡答,附加題可做可不做,最後我們決定準時交卷還是提前交卷。所以在父類的模板方法中,我們定義了一系列的執行流程,並提供鉤子方法讓子類重寫來決定是否做附加題,還提供了抽象方法讓子類實現必須交卷的方法。
模板模式的要點在於複用抽象類的公共方法,重寫抽象類中的抽象方法,選擇性使用抽象類的鉤子方法。
總結一句話:子類可以重寫父類中允許改變的邏輯。
模板模式可以提高代碼的擴展性,父類控制流程,子類實現具體流程,符合開閉原則。