設計模式從零開始——模板方法模式
阿新 • • 發佈:2019-01-12
“橫看成嶺側成峰,遠近高低各不同”
說的就是山是同一座山,但是不同的人站在不同的角度,看到的山的樣子也不一樣。就像最近在看一檔節目,叫做《最強大腦》,裡面都是天才、神童、天之驕子,都是站在智商頂峰的一群人,對於節目中難到變態的題目,我只會笑一笑然後放棄,但是那些天才們經過一陣頭腦風暴後,問題總會迎刃而解。題目還是那些題目,但是對於答題的人來講,答案卻是五花八門。
說了這麼多,就是為了引出今天要說的設計模式——【模板方法模式】。所謂模板,就是固定下來不變的東西,比如考試時的試卷,每個人的領到的試卷題目都是相同的,但是考試的人給出的答案就有對有錯,這就是模板方法模式:定義一個操作中的演算法骨架,而將一些步驟延遲到子類中,模板方法是的子類可以不改變一個演算法的結構,即可定義該演算法的某些特定步驟。
就拿學生答題舉例,試卷就是模板,學生的答案就是子類的方法,程式碼如下:
試卷類:
學生A:public class TestPaper { public void QuestionA() { System.out.print("試題一:A.x B.x C.x D.x "); System.out.println("答案為:" + AnswerA()); } protected String AnswerA() { return ""; } public void QuestionB() { System.out.print("試題二:A.x B.x C.x D.x "); System.out.println("答案為:" + AnswerB()); } protected String AnswerB() { return ""; } public void QuestionC() { System.out.print("試題三:A.x B.x C.x D.x "); System.out.println("答案為:" + AnswerC()); } protected String AnswerC() { return ""; } }
public class StudentA extends TestPaper {
@Override
protected String AnswerA() {
return "A";
}
@Override
protected String AnswerB() {
return "B";
}
@Override
protected String AnswerC() {
return "C";
}
}
學生B:
public class StudentB extends TestPaper { @Override protected String AnswerA() { return "A"; } @Override protected String AnswerB() { return "B"; } @Override protected String AnswerC() { return "C"; } }
客戶端:
public class Paper {
public static void main(String[] args) {
TestPaper answerA = new StudentA();
System.out.println("學生A:");
answerA.QuestionA();
answerA.QuestionB();
answerA.QuestionC();
TestPaper answerB = new StudentB();
System.out.println("學生B:");
answerB.QuestionA();
answerB.QuestionB();
answerB.QuestionC();
}
}
輸出結果: