设计模式之模板方法模式代码示例

1、课程抽象类

/**
 * 课程抽象类
 */
public abstract class ACourse {

    /**
     * 制作课程 模板方法
     */
    protected final void makeCourse() {
        this.makePPT();// 必选步骤
        this.makeVideo();// 必选步骤
        if (needWriteArticle()) {
            this.writeArticle();// 可选步骤
        }
        this.packageCourse();// 子类实现的步骤
    }

    /**
     * 制作PPT
     */
    final void makePPT() {
        System.out.println("制作PPT");
    }

    /**
     * 录制视频
     */
    final void makeVideo() {
        System.out.println("录制视频");
    }

    /**
     * 编写手记
     */
    final void writeArticle() {
        System.out.println("编写手记");
    }

    /**
     * 是否编写手记
     * (钩子方法)
     *
     * @return
     */
    protected boolean needWriteArticle() {
        return false;
    }

    /**
     * 打包课程(抽象方法,由子类去实现)
     */
    abstract void packageCourse();
}

2、前端课程类

public class FECourse extends ACourse {

    private boolean needWriteArticleFlag;

    public FECourse(boolean needWriteArticleFlag) {
        this.needWriteArticleFlag = needWriteArticleFlag;
    }

    @Override
    void packageCourse() {
        System.out.println("提供前端源代码");
        System.out.println("提供前端多媒体素材");
    }

    @Override
    protected boolean needWriteArticle() {
        return this.needWriteArticleFlag;
    }
}

3、前端Vue课程类

/**
 * Vue 课程
 */
public class VueFECourse extends FECourse {

    /**
     * 是否编写手记
     *
     * @param needWriteArticleFlag
     */
    public VueFECourse(boolean needWriteArticleFlag) {
        super(needWriteArticleFlag);
    }
}

4、前端Reactor课程类

/**
 * Reactor 课程
 */
public class ReactorFECourse extends FECourse {

    /**
     * 是否编写手记
     *
     * @param needWriteArticleFlag
     */
    public ReactorFECourse(boolean needWriteArticleFlag) {
        super(needWriteArticleFlag);
    }
}

5、设计模式课程类

public class DesignPatternCourse extends ACourse {

    @Override
    void packageCourse() {
        System.out.println("设计模式课程");
    }

    /**
     * 是否编写手记
     *
     * @return
     */
    @Override
    protected boolean needWriteArticle() {
        return true;
    }
}

6、测试类

public class MainTest {

    public static void main(String[] args) {
        DesignPatternCourse designPatternCourse = new DesignPatternCourse();
        designPatternCourse.makeCourse();

        System.out.println("---------------------------");

        VueFECourse vueFECourse = new VueFECourse(false);
        vueFECourse.makeCourse();

        System.out.println("---------------------------");

        ReactorFECourse reactorFECourse = new ReactorFECourse(true);
        reactorFECourse.makeCourse();
    }
}

运行测试类执行结果:

制作PPT
录制视频
编写手记
设计模式课程
---------------------------
制作PPT
录制视频
提供前端源代码
提供前端多媒体素材
---------------------------
制作PPT
录制视频
编写手记
提供前端源代码
提供前端多媒体素材

猜你喜欢

转载自www.cnblogs.com/jun1019/p/11876825.html