定義:在基類中定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。 可以理解為將不變的行為放在父類中,會發生變化的行為在子類中實現,這樣可以避免子類中出現大量重覆的代碼。也就是說當子類中的方法混合了不變和可變的行為,我們通過模 ...
定義:在基類中定義一個操作中的演算法的骨架,而將一些步驟延遲到子類中。模板方法使得子類可以不改變一個演算法的結構即可重定義該演算法的某些特定步驟。
可以理解為將不變的行為放在父類中,會發生變化的行為在子類中實現,這樣可以避免子類中出現大量重覆的代碼。也就是說當子類中的方法混合了不變和可變的行為,我們通過模板方法就能將這些不變的行為放到一個單獨的地方。模板方法的類結構比較簡單,下麵直接貼出代碼
父類
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 { @Override public void changeMethod1() { System.out.println("子類A的可變方法1"); } @Override public void changeMethod2() { System.out.println("子類A的可變方法2"); } }
public class ConcreteClassB extends AbstractClass { @Override public void changeMethod1() { 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 { @Override public void answer1() { System.out.println("A"); } @Override public void answer2() { 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();
以上就是整個功能的實現代碼,可以通過點擊以下鏈接獲取完整代碼