設計模式-模板方法
定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
模板方法通過把不變的行爲搬到父類,去除子類中的重複代碼來提現他的優勢。
模板方法其實就是我們抽象類的寫法,抽象類中有兩種方法,一種就是已經實現了的,一種就是還沒有實現的。已經實現了的就是通用的方法,還沒有實現就是每個子類不同的處理方法。
這個設計模式是我們經常使用的,但可能你並不知道它的名字。
先來個UML圖:
下面簡單例子:
考試的題目對大家一樣的,但是答案每個人都可能不同。所以題目可以在父類實現,而答案需要在子類進行重寫。
先來個父類:
/**
* 考試抽象類
*/
public abstract class Exam {
/**
* 問題1 對所有人都一樣
*/
public void quesA(){
System.out.println("1: 1+1 = ?");
}
/**
* 問題2 對所有人都一樣
*/
public void quesB(){
System.out.println("2: 2+5 = ?");
}
/**
* 問題3 對所有人都一樣
*/
public void quesC(){
System.out.println("3: 10-3 = ?");
}
/**
* 交卷 所有人都一樣
*/
public void submit(){
name();
quesA();
answerA();
quesB();
answerB();
quesC();
answerC();
System.out.println();
}
/**
* 名字
*/
abstract void name();
/**
* 答案1 需要每個人實現
*/
abstract void answerA();
/**
* 答案2 需要每個人實現
*/
abstract void answerB();
/**
* 答案3 需要每個人實現
*/
abstract void answerC();
}
小李做的試卷:
public class LiExam extends Exam {
@Override
void name() {
System.out.println("小李");
}
@Override
void answerA() {
System.out.println("2");
}
@Override
void answerB() {
System.out.println("7");
}
@Override
void answerC() {
System.out.println("7");
}
}
小紅做的試卷:
public class HongExam extends Exam {
@Override
void name() {
System.out.println("小紅");
}
@Override
void answerA() {
System.out.println("2");
}
@Override
void answerB() {
System.out.println("9");
}
@Override
void answerC() {
System.out.println("7");
}
}
測試:
public static void main(String[] args) {
Exam li = new LiExam();
li.submit();
Exam hong = new HongExam();
hong.submit();
}
測試結果:
小李
1: 1+1 = ?
2
2: 2+5 = ?
7
3: 10-3 = ?
7
小紅
1: 1+1 = ?
2
2: 2+5 = ?
9
3: 10-3 = ?
7
上面的例子還是很簡單的,你可以簡單感受下模板方法的用法,感覺是不是就是特別簡單,以前你也一直在使用。
設計模式也就是這樣,他的思路都沒有那麼複雜,他就是我們經驗的總結。