首页 > 编程笔记 > Java笔记

使用模板模式实现课程基本流程

假设 新宝库要开发网课业务,那么创建课程流程为:发布预习资料➡制作课件PPT➡在线直播➡提交课堂笔记➡提交源码➡布置作业➡检查作业。
public abstract class AbstractCourse {
    public final void createCourse() {
        //1、发布预习资料
        postPreResource();

        //2、制作课件
        createPPT();

        //3、在线直播
        liveVideo();

        //4、提交课堂笔记
        postNote();

        //5、提交源码
        postResource();

        //6、布置作业
        postHomework();

        //7、检查作业
        if (needCheckHomework()) {
            checkHomework();
        }
    }

    protected abstract void checkHomework();

    //钩子方法
    protected boolean needCheckHomework() {
        return false;
    }

    protected void postHomework() {
        System.out.println("布置作业");
    }

    protected void postNote() {
        System.out.println("提交课程笔记");
    }

    protected void postResource() {
        System.out.println("提交源码");
    }

    protected void liveVideo() {
        System.out.println("在线直播");
    }

    protected void createPPT() {
        System.out.println("制作课件");
    }

    protected void postPreResource() {
        System.out.println("发布预习资料");
    }
}
其中的 createCourse() 是模板方法,它定义了网课业务的基本流程。postPreResource()、createPPT()、liveVideo()、postNote()、postResource()、postHomework() 这 6 个步骤在所有课程中都是固定的,只有 checkHomework() 方法在所有课程中都不一样,所以声明为抽象方法,由子类自行实现。钩子方法 needCheckHomework 返回一个 boolean 类型的值,控制是否需要检查作业。

我们在《模板方法设计模式》一节已经简单了解了钩子方法,在这里再稍作解释。设计钩子方法的主要目的是干预执行流程,使得控制执行流程更加灵活,更符合实际业务的需求。钩子方法的返回值一般为条件分支语句的返回值,小伙伴们可以根据自己的业务场景决定是否需要使用钩子方法。

然后创建 JavaCourse 类实现 cheakHomework() 方法,并重写 needCheckHomework() 方法。
public class JavaCourse extends AbstractCourse {
    private boolean needCheckHomework = false;

    public void setNeedCheckHomework(boolean needCheckHomework) {
        this.needCheckHomework = needCheckHomework;
    }

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

    protected void checkHomework() {
        System.out.println("检查Java作业");
    }
}
创建 PythonCourse 类。
public class PythonCourse extends AbstractCourse {
    private boolean needCheckHomework = false;

    public void setNeedCheckHomework(boolean needCheckHomework) {
        this.needCheckHomework = needCheckHomework;
    }

    @Override
    protected boolean needCheckHomework() {
        return this.needCheckHomework;
    }
    protected void checkHomework() {
        System.out.println("检查Python作业");
    }
}
最后,客户端测试代码如下:
public class Test {
    public static void main(String[] args) {
        System.out.println("=========Java课程start=========");
        JavaCourse java = new JavaCourse();
        java.setNeedCheckHomework(true);
        java.createCourse();

        System.out.println("=========Python课程start=========");
        PythonCourse python = new PythonCourse();
        python.setNeedCheckHomework(true);
        python.createCourse();
    }
}
运行结果如下:

=========Java课程start=========
发布预习资料
制作课件
在线直播
提交课程笔记
提交源码
布置作业
检查Java作业
=========Python课程start=========
发布预习资料
制作课件
在线直播
提交课程笔记
提交源码
布置作业
检查Python作业

通过本节实例,相信小伙伴们都对模板方法模式有了一个基本的印象。为了加深对模板方法模式的理解,我们在下一节会结合一个常见的业务场景再次进行介绍。

所有教程

优秀文章