有时候,我们需要定义某个方法,这个方法在高层次来看是相同的,但是里面几个具体步骤有可能有些不同。
一种实现方法是父类定义一个虚方法,由多个子类具体实现。但是这样做的话,不变的和可变的行为在子类中是混合在一起的,造成代码的大量重复。
这时候我们需要使用模板方法模式。
模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义算法的某些特定步骤。
这个模式通过将不变的行为搬移到父类,去除子类中的重复代码。
UML图:
在父类中,templateMethod是模板方法,需要调用primitiveMethod1和primitiveMethod2两个虚方法。
子类中对这两个虚方法给出了具体实现。
代码:
AbstractClass及其子类:
public abstract class AbstractClass {
public void templateMethod() {
primitiveMethod1();
primitiveMethod2();
System.out.println("templateMethod");
}
protected abstract void primitiveMethod1();
protected abstract void primitiveMethod2();
}
public class ConcreteClass1 extends AbstractClass {
@Override
protected void primitiveMethod1() {
System.out.println("ConcreteClass1.primitiveMethod1");
}
@Override
protected void primitiveMethod2() {
System.out.println("ConcreteClass1.primitiveMethod2");
}
}
public class ConcreteClass2 extends AbstractClass {
@Override
protected void primitiveMethod1() {
System.out.println("ConcreteClass2.primitiveMethod1");
}
@Override
protected void primitiveMethod2() {
System.out.println("ConcreteClass2.primitiveMethod2");
}
}
Demo:
public class TemplateDemo {
public static void main(String[] args) {
AbstractClass class1 = new ConcreteClass1();
class1.templateMethod();
AbstractClass class2 = new ConcreteClass2();
class2.templateMethod();
}
}