美文网首页
模版方法模式

模版方法模式

作者: KingdomCoder | 来源:发表于2018-12-31 14:18 被阅读0次

    定义:

    定义了一个算法的骨架,并允许子类为一个或多个步骤提供实现,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。(行为型)

    适应场景:

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

    有点:

    1.提高复用性
    2.提高扩展性
    3.符合开闭原则

    缺点:

    1.类数目增加
    2.增加了系统的复杂度
    3.继承关系自身的缺点,如果父类

    Coding:

    ACourse抽象模版方法

    /**
     * @program: design-pattern
     * @description:
     * @author: KingdomCoder
     * @create: 2018/12/31 下午12:29
     **/
    public abstract class ACourse {
    
        //课程制作流程不能被子类重写
        protected final void makeCourse() {
            this.makePPT();
            this.makeVideo();
            if(needWriteAticle()){
                this.needWriteAticle();
            }
            this.packageCourse();
    
        }
    
        //制作PPT
        final void makePPT() {
            System.out.println("制作PPT");
        }
    
        //制作课程视频
        final void makeVideo() {
            System.out.println("制作课程视频");
        }
    
        //编写手记
        final void writeArticle() {
    
        }
    
        //是否需要编写手记---可被子类重写(钩子方法)
        protected boolean needWriteAticle() {
            return false;
        }
    
        //抽象方法(每个课程的包装都不一样)
        abstract void packageCourse();
    }
    

    DesignPatternCourse通过钩子方法控制是否需要写手记

    @AllArgsConstructor
    @NoArgsConstructor
    public class DesignPatternCourse extends ACourse{
    
        private boolean needWriteArticle = false;
    
        @Override
        protected boolean needWriteAticle() {
            return true;
        }
    
        @Override
        void packageCourse() {
            System.out.println("提供课程JAVA代码");
        }
    }
    

    FECourser子类实现自己的模版方法

    /**
     * @program: design-pattern
     * @description:
     * @author: KingdomCoder
     * @create: 2018/12/31 下午12:37
     **/
    @AllArgsConstructor
    @NoArgsConstructor
    public class FECourser extends ACourse {
    
        private boolean needWriteArticle = false;
    
    
    
        @Override
        protected boolean needWriteAticle() {
            return needWriteArticle;
        }
    
        @Override
        void packageCourse() {
            System.out.println("提供前端代码");
            System.out.println("提供前端多媒体素材");
        }
    }
    

    Test测试类:

    /**
     * @program: design-pattern
     * @description:
     * @author: KingdomCoder
     * @create: 2018/12/31 下午12:39
     **/
    public class Test {
    
        public static void main(String[] args) {
            System.out.println("后端设计模式课程start----");
            ACourse designPattern = new DesignPatternCourse();
            designPattern.makeCourse();
            System.out.println("后端设计模式end---");
    
    
            System.out.println("前端设计模式课程start----");
            //将是否写手记由应用层控制
            ACourse feCourse = new FECourser(true);
            feCourse.makeCourse();
            System.out.println("前端设计模式end---");
        }
    
    }
    

    测试结果为:

    后端设计模式课程start----
    制作PPT
    制作课程视频
    提供课程JAVA代码
    后端设计模式end---
    前端设计模式课程start----
    制作PPT
    制作课程视频
    提供前端代码
    提供前端多媒体素材
    前端设计模式end---
    
    Process finished with exit code 0
    

    UML:

    模版方法模式.png 微信公众号欢迎关注.jpg

    相关文章

      网友评论

          本文标题:模版方法模式

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