定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。
简单来说:给出实现某件事的步骤顺序,这些顺序我们不能改变,我们只能改变步骤的内容。比如给出步骤顺序:1.动物先清洗 2. 动物吃食物 3. 动物去玩,其中(1,2,3)这些顺序不能改变,而具体清洗什么,吃什么。玩什么这些具体事情可以由子类重新定义
public abstract class Template {
// 非模板方法可抽象或是具体的
abstract void clean();
abstract void eat();
abstract void play();
// 模板方法修饰为final即不可重写,步骤规定不可变
public final void templateMethod(){
clean();
eat();
play();
}
}
public class Dog extends Template {
@Override
void clean() {
System.out.println("狗先洗脚");
}
@Override
void eat() {
System.out.println("狗然后吃肉");
}
@Override
void play() {
System.out.println("狗然后在家玩");
}
}
public class Cat extends Template {
@Override
void clean() {
System.out.println("猫先洗手");
}
@Override
void eat() {
System.out.println("猫然后吃鱼");
}
@Override
void play() {
System.out.println("猫最后出去玩");
}
}
public static void main(String[] args) {
new Dog().templateMethod();
System.out.println("----------人工分割线-----------");
new Cat().templateMethod();
}
狗先洗脚
狗然后吃肉
狗最后在家玩
----------人工分割线-----------
猫先洗手
猫然后吃鱼
猫最后出去玩
从上面的实现可以知道,我们可定义动物们的事件的内容,而这些事件的发生顺序是被规定好了,用了final修饰而不能重写该方法。