基础与定义
- 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
 - 模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
 - 类型:行为型
 
使用场景:
- 一次性实现一个算法不可变的部分,并将可变的行为留给子类来实现
 - 各子类中中共行为被提取出来并集中到一个公共父类中,从而避免代码重复
 
源码实例
- ArrayList addAll方法
 
代码实例
准备录制课程,可以是前端课程,可以是后段课程
// 课程抽象类
public abstract class ACourse {
    protected final void makeCourse(){
        this.makePPT();
        this.makeVideo();
        if (needwriteArticle()){
            this.writeArticle();
        }
        this.packageCourse();
    }
    final void makePPT(){
        System.out.println("制作PPT");
    }
    final void makeVideo(){
        System.out.println("制作视频");
    }
    final void writeArticle(){
        // 可选项
        System.out.println("编写手记");
    }
    // 钩子方法
    protected boolean needwriteArticle(){
        return false;
    }
    // 子类实现的方法
    abstract void packageCourse();
}
// java 课程
public class DesignPatternCourse extends ACourse {
    @Override
    void packageCourse() {
        System.out.println("提供Java课程源代码");
    }
    @Override
    protected boolean needwriteArticle() {
        return true;
    }
}
// 前端课程
public class FECourse extends ACourse {
    @Override
    void packageCourse() {
        System.out.println("提供课程前端代码");
        System.out.println("提供课程多媒体素材");
    }
}
// 测试类
public class Test {
    public static void main(String[] args){
        System.out.println("后端课程 -- start");
        ACourse decourse = new DesignPatternCourse();
        decourse.makeCourse();
        System.out.println("后端课程 -- end");
        ACourse feCourse = new FECourse();
        feCourse.makeCourse();
    }
}