zoukankan      html  css  js  c++  java
  • 设计模式之模板方法模式代码示例

    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
    录制视频
    编写手记
    提供前端源代码
    提供前端多媒体素材
  • 相关阅读:
    【C#】SuperSocket配置启动UDP服务器
    【UWB】DWM1000 室内定位串口协议说明
    【Unity3D】把相机视角放置到编辑器当前位置视角
    【DXP】如何在原理图中批量修改
    request中的gizp提交解析以及提交请求
    java基础知识----循环
    pymongo.errors.CursorNotFound: Cursor not found
    xposed入门(二)---hook方法入参
    VulnHub靶场篇9-SkyTower: 1
    VulnHub靶场篇8-IMF:1
  • 原文地址:https://www.cnblogs.com/jun1019/p/11876825.html
Copyright © 2011-2022 走看看