定义:在基类中定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
可以理解为将不变的行为放在父类中,会发生变化的行为在子类中实现,这样可以避免子类中出现大量重复的代码。也就是说当子类中的方法混合了不变和可变的行为,我们通过模板方法就能将这些不变的行为放到一个单独的地方。模板方法的类结构比较简单,下面直接贴出代码
父类
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();
以上就是整个功能的实现代码,可以通过点击以下链接获取完整代码