1    代码演练

1.1  代码演练1

1.2  代码演练2

1.3  代码演练3

1    代码演练

1.1  代码演练1

目的:

uml类图:

测试类:

package com.geely.design.pattern.behavioral.templatemethod;

public class Test {
    public static void main(String [] args){

        System.out.println("=======================后端课程开始");
        ACourse aCourse1 = new DesignPatternCourse();
        aCourse1.makeCourse();
        System.out.println("=======================后端课程结束");


        System.out.println("=======================前端课程开始");
        ACourse aCourse2 = new FECourse();
        aCourse2.makeCourse();
        System.out.println("=======================前端课程结束");
    }
}

抽象课程父类:

package com.geely.design.pattern.behavioral.templatemethod;

/**
 * 制作抽象类 课程类,用于被其他类继承
 */
public abstract class ACourse {

    /**
     * 整合课程 的方法,
     * 该流程是固定的,子类不能重写
     */
    protected final void makeCourse(){
        makePPT();
        makeVideo();
        if(needMakeArticle()){
            makeArticle();
        }
        packageCourse();
    }
    /**
     * 制作PPT 方法
     * 目的:如果想要每个子类都不能重写该方法,就用final修饰
     * 原因:每个子类都必须有制作PPT的方法
     */
    final void makePPT(){
        System.out.println("开始制作PPT");
    }

    /**
     * 同上
     */
    final void makeVideo(){
        System.out.println("制作课程视频");
    }

    /**
     * 制作手记方法
     * 该方法不可被重写
     * 有的课程需要制作,有的课程不需要
     */
    final void makeArticle(){
        System.out.println("编写手记");
    }

    /**
     * 添加钩子方法
     * 该方法可被子类重写,用于判断子类是否需要制作手记
     * @return
     */
    protected boolean needMakeArticle(){
        return false;
    }

    /**
     * 包装课程方法,
     * 目的:不同的课程,包装的素材也不一样,所以声明抽象的,子类可以重写
     */
    abstract void packageCourse();
}

前端子类:

package com.geely.design.pattern.behavioral.templatemethod;

public class FECourse extends ACourse{
    /**
     * 不同子类实现不同包装方法
     */
    @Override
    void packageCourse() {
        System.out.println("提供课程前端代码");
        System.out.println("提供课程图片素材");
    }
}

后端子类:

package com.geely.design.pattern.behavioral.templatemethod;

/**
 * 设计模式课程,
 * 业务场景:不用编写手记
 */
public class DesignPatternCourse extends ACourse{
    /**
     * 不同子类实现不同包装方法
     */
    @Override
    void packageCourse() {
        System.out.println("后端包装方法实现");
    }
}

打印结果:

=======================后端课程开始
开始制作PPT
制作课程视频
后端包装方法实现
=======================后端课程结束
=======================前端课程开始
开始制作PPT
制作课程视频
提供课程前端代码
提供课程图片素材
=======================前端课程结束

Process finished with exit code 0

1.2  代码演练2

1.3  代码演练3

01-15 21:51