码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-11-17 16:15:46      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:设计   col   end   div   int   编写   抽象类   nbsp   抽象   

 

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
录制视频
编写手记
提供前端源代码
提供前端多媒体素材

 

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

标签:设计   col   end   div   int   编写   抽象类   nbsp   抽象   

原文地址:https://www.cnblogs.com/jun1019/p/11876825.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!