美文网首页
设计模式(十四)-- 模板方法模式

设计模式(十四)-- 模板方法模式

作者: 信仰年輕 | 来源:发表于2018-12-05 16:22 被阅读0次

    源代码
    GitHub源代码

    1.本文目标

    本文目标是为了让大家认识并理解模板方法模式

    2.基本套路

    定义:定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现
    类型:行为型
    选择关键点:算法骨架是否牢固
    设计原则:破坏里氏替换,体现功能复用
    使用概率:80%
    难度系数:中低

    3.适用场景

    1.一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现
    2.各子类中公共的行为被提取出来并集中到一个公共父类中,从而避免代码重复

    4.使用步骤

    用栗子能更好的说明问题,请继续往下看

    5.举个栗子

    我们用具体的代码去更好的理解这个设计模式

    5.1栗子说明

    • 背景:录制视频都需要编写ppt,制作视频和写手记,然后用这个模板制作不同的课程
    • 目的:通过模板方法去制作

    5.2使用步骤

    实现代码如下:

    步骤1.创建课程抽象类

    public abstract class ACourse {
    
        //模板方法 制作课程
        protected final void makeCourse(){
            this.makePPT();
            this.makeVideo();
            if(needWriteArticle()){
                this.writeArticle();
            }
            this.packageCourse();
        }
    
        final void makePPT(){
            System.out.println("制作PPT");
        }
        final void makeVideo(){
            System.out.println("制作视频");
        }
        final void writeArticle(){
            System.out.println("编写手记");
        }
        //钩子方法
        protected boolean needWriteArticle(){
            return false;
        }
        
        //包装课程
        abstract void packageCourse();
    }
    

    步骤2.创建设计模式课程,继承抽象课程类

    public class DesignPatternCourse extends ACourse {
        @Override
        void packageCourse() {
            System.out.println("提供课程Java源代码");
        }
    
        @Override
        protected boolean needWriteArticle() {
            return true;
        }
    }
    

    步骤3.创建前端课程,继承抽象课程类

    public class FECourse extends ACourse {
    
        private boolean needWriteArticleFlag = false;
    
        @Override
        void packageCourse() {
            System.out.println("提供课程的前端代码");
            System.out.println("提供课程的图片等多媒体素材");
        }
    
        public FECourse(boolean needWriteArticleFlag) {
            this.needWriteArticleFlag = needWriteArticleFlag;
        }
    
        @Override
        protected boolean needWriteArticle() {
            return this.needWriteArticleFlag;
        }
    }
    
    

    步骤4. 测试

     public static void main(String[] args) {
            System.out.println("设计模式课程start---");
            ACourse designPatternCourse = new DesignPatternCourse();
            designPatternCourse.makeCourse();
            System.out.println("设计模式课程end---");
    
    
            System.out.println("前端课程start---");
            ACourse feCourse = new FECourse(false);
            feCourse.makeCourse();
            System.out.println("前端课程end---");
     }
    

    6.优点

    • 提高复用性
    • 提高扩展性
    • 符合开闭原则

    7.缺点

    • 类数目的增加
    • 增加了系统实现的复杂度
    • 继承关系自身缺点,如果父类添加新的抽象方法,所有的子类都要改一遍

    8.总结

    本文只是对模板方法模式进行一个分享,接下来会从创建型模式,结构型模式,行为型模式,这三大类展开一个系列分享,大家可以持续进行关注,信仰年輕的设计模式,蟹蟹啦。

    相关文章

      网友评论

          本文标题:设计模式(十四)-- 模板方法模式

          本文链接:https://www.haomeiwen.com/subject/fwaicqtx.html