设计模式-行为型-模版方法

Posted by YaPi on May 10, 2018

基础与定义

  • 定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
  • 模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤
  • 类型:行为型

使用场景:

  1. 一次性实现一个算法不可变的部分,并将可变的行为留给子类来实现
  2. 各子类中中共行为被提取出来并集中到一个公共父类中,从而避免代码重复

源码实例

  1. 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();
    }
}