有时候,我们需要定义某个方法,这个方法在高层次来看是相同的,但是里面几个具体步骤有可能有些不同。
一种实现方法是父类定义一个虚方法,由多个子类具体实现。但是这样做的话,不变的和可变的行为在子类中是混合在一起的,造成代码的大量重复。
这时候我们需要使用模板方法模式。
模板方法模式:定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构,即可重定义算法的某些特定步骤。
这个模式通过将不变的行为搬移到父类,去除子类中的重复代码。
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(); } }
时间: 2024-10-10 08:36:49