前言
在Java開發中模板方法模式相信大家都很熟悉,但是又有幾個小夥伴熟練掌握了呢?在這裏就模板方法模式將做一個詳細的講解。
正文
定義:在基類中定義一個操作中的算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個算法的結構即可重定義該算法的某些特定步驟。
可以理解爲將不變的行爲放在父類中,會發生變化的行爲在子類中實現,這樣可以避免子類中出現大量重複的代碼。也就是說當子類中的方法混合了不變和可變的行爲,我們通過模板方法就能將這些不變的行爲放到一個單獨的地方。模板方法的類結構比較簡單,下面直接貼出代碼
父類
public abstract class AbstractClass {
/**
- 可變方法1
*/
public abstract void changeMethod1();
/** - 可變方法2
*/
public abstract void changeMethod2();
public void templateMethod() {
System.out.println("執行可變方法1前");
changeMethod1();
System.out.println("執行可變方法1後");
System.out.println("執行可變方法2前");
changeMethod2();
System.out.println("執行可變方法2後");
}
}
兩個子類
public class ConcreteClassA extends AbstractClass {br/>@Override
public void changeMethod1() {}
@Override
br/>System.out.println("子類A的可變方法1");
}
@Override
public void changeMethod2() {
System.out.println("子類A的可變方法2");
}
}
public class ConcreteClassB extends AbstractClass {br/>@Override
public void changeMethod1() {}
@Override
br/>System.out.println("子類B的可變方法1");
}
@Override
public void changeMethod2() {
System.out.println("子類B的可變方法2");
}
}
測試代碼和輸出結果
AbstractClass a = new ConcreteClassA();
a.templateMethod();
System.out.println("------------------");
AbstractClass b = new ConcreteClassB();
b.templateMethod();
從上面代碼可以看出templateMethod方法中只有一部分是會隨子類的實現不同發生改變,通過模板方法讓我們不需要在子類中重複編寫那些不變的代碼。接下來我們通過一個簡單的抄考卷的例子,來加深對模板方法的理解,代碼如下
考卷抽象類
public abstract class AbstractPaper {
public void createPaper() {
question1();
answerText();
answer1();
question2();
answerText();
answer2();
question3();
answerText();
answer3();
}
public void question1() {
System.out.println("問題1:");
}
public void question2() {
System.out.println("問題2:");
}
public void question3() {
System.out.println("問題3:");
}
public void answerText() {
System.out.print("答案:");
}
/**
- 問題1的答案
*/
public abstract void answer1();
/** - 問題2的答案
*/
public abstract void answer2();
/** - 問題3的答案
*/
public abstract void answer3();
}
兩張答案不同的考卷(省略一個,代碼類似)
public class PaperA extends AbstractPaper {br/>@Override
public void answer1() {}
@Override
br/>System.out.println("A");
}
@Override
public void answer2() {}
@Override
br/>System.out.println("B");
}
@Override
public void answer3() {
System.out.println("C");
}
}
測試代碼和輸出結果
AbstractPaper paperA = new PaperA();
paperA.createPaper();
System.out.println("------------");
AbstractPaper paperB = new PaperB();
paperB.createPaper();
結尾
以上就是整個功能的實現代碼。