定义一个算法的骨架,将其中的某些步骤的实现延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
模板方法可以使用一些抽象的操作定义一个算法,而子类重定义这些操作以提供具体的行为。通过使用抽象操作定义算法中的某些步骤,模板方法确定了它们的先后顺序,子类再实现这些抽象方法,这样一个完整的算法就完成了。模板方法适用于,算法中具有某些不变部分,并可以将不变的行为交给子类来实现,或者是子类中的公共行为可以被提取到公共父类中,以避免代码重复。
public abstract class AbstractClass {
public void templateMethod() {
primitiveOperation1();
primitiveOperation2();
}
protected abstract void primitiveOperation1();
protected abstract void primitiveOperation2();
}
public class ConcreteClass extends AbstractClass{
@Override
protected void primitiveOperation1() {
System.out.println("Do Operation1!");
}
@Override
protected void primitiveOperation2() {
System.out.println("Do Operation2!");
}
}
public class Client {
@Test
public void test(){
AbstractClass method = new ConcreteClass();
method.templateMethod();
}
}
AbstractClass定义了抽象的算法步骤,其中包含了实现这些步骤的过程,但是并没有具体的步骤实现。ConcreteClass继承自AbstractClass,它给出了AbstractClass中的抽象步骤的实现方法,ConcreteClass不需要重新定义算法步骤,这些步骤已经在AbstractClass中定义过了。当需要多种类型的算法,或者算法计算步骤中的部分计算方式存在不同时,这些算法是可以相互替换的。这和Strategy很像,但是它们的目标不同Template Method的目标是维护算法中的不变部分,而Strategy是为了实现不同算法的封装和替换,它修改的是整个算法。
模板方法可以实现一些很特殊的行为,如原语操作(抽象方法类中规定的抽象方法都可以看作是原语操作,这些操作都是一个独立的完整步骤),钩子操作(钩子操作提供一种默认的行为,子类可以在需要时拓展这个方法,从而提供额外的功能)等。