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
    录制视频
    编写手记
    提供前端源代码
    提供前端多媒体素材
  • 相关阅读:
    Wannafly挑战赛14 F.细胞
    D 勤奋的杨老师(二)(最小割)
    三分算法求最值
    初识最大流
    初识数据结构
    决策型DP
    哈希表
    【BZOJ】1878: [SDOI2009]HH的项链 (主席树)
    【HDU】1520 Anniversary party(树形dp)
    【UVa】1606 Amphiphilic Carbon Molecules(计算几何)
  • 原文地址:https://www.cnblogs.com/jun1019/p/11876825.html
Copyright © 2011-2022 走看看