定义:Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s stucture. 即为某一操作我们确定一种算法框架,但却将其某些步骤延迟到子类完成,使得子类可以在不改变该算法架构的情况下确定其特定实现步骤。换句话说,父类将某操作拆分成多个细小的操作,而让子类去确定如何完成这些细小的操作,父类只需要定义这些操作的执行顺序,从而完成特定的事情。
而在父类(称为抽象模板)中,这些被拆分得到的细小操作被称为基本方法,具体由子类去实现,而父类中实现的关于基本方法的调用顺序的方法称为模板方法。
首先,先列出一个典型的类图:
其中,AbstractClass为抽象模板,其基本方法step0()和step1()由子类去实现,而在模板方法templateMethod()中定义了其调用过程。下面的例子以中西方吃饭过程为例,看代码:
/**
* Created by Song on 2016/9/6.
* 抽象模板
*/
public abstract class AbstractClass {
//步骤0(基本方法)
protectedabstract void step0();
//步骤1(基本方法)
protectedabstract void step1();
//模板方法
public void templateMethod(){
//确定基本方法的调用顺序,完成特定功能
this.step0();
this.step1();
}
}
**
* Created by Song on 2016/9/6.
* 具体类1
*/
public class ConcreteClass1 extends AbstractClass {
@Override
protectedvoid step0() {
System.out.println("步骤0:拿起筷子");
}
@Override
protectedvoid step1() {
System.out.println("步骤1:开始吃饭");
}
}
**
* Created by Song on 2016/9/6.
*/
public class ConcreteClass2 extends AbstractClass {
@Override
protectedvoid step0() {
System.out.println("步骤0:拿起刀叉");
}
@Override
protectedvoid step1() {
System.out.println("步骤1:开始吃饭");
}
}
**
1. Created by Song on 2016/9/6.
2. 测试类
*/
public class Main {
public static void main(String [] args){
//中国人的吃饭方式
System.out.println("中国人吃饭过程:");
AbstractClass chinese = new ConcreteClass1();
chinese.templateMethod();
//西方人的吃饭方式
System.out.println("西方人吃饭过程:");
AbstractClass foreigner = new ConcreteClass2();
foreigner.templateMethod();
}
}
执行结果:
其典型特点为:
1. 封装不变部分,扩展可变部分
2. 行为由父类控制,而具体细节由子类根据实际需要实现。