模板方法模式

栏目: 后端 · 发布时间: 7年前

内容简介:定义了一个算法的骨架。并允许子类为一个或多个步骤提供实现。模板方法是的子类可以在不改变算法结构的情况下,重新定义算法的某些步骤行为型

模板方法模式

定义

定义了一个算法的骨架。并允许子类为一个或多个步骤提供实现。

定义补充

模板方法是的子类可以在不改变算法结构的情况下,重新定义算法的某些步骤

类型

行为型

适用场景

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

优点

  1. 提高复用性,将公共代码放在父类中实现提高了复用性
  2. 提高拓展性,通过增加子类来拓展新的行为。

缺点

继承关系自身的缺点,如果父类添加新的抽象方法,所有子类都要修改。

下面开始写代码,假设一个场景就是我们要制作一套课程,这些课程可能包含一定包含视频ppt,不一定包含文章。

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();

}

这里定义了一个抽象的课程方法。对于那些一定有的内容我们生命成final的,写文章这个方法我们也声明成final,但是我们定义了一个钩子方法,这个钩子方法子类可以重写,对于需要写文章的方法我们就返回true,不需要的我们就返回false。makeCourse方法中定义了执行流程,在最后我们调用了this.packageCourse方法,这个调用其实是在调用子类方法,因为我们这个是交由子类来执行。通过向上转型来调用父类方法,然后this指代是当前对象也就是子类对象,不太明白的话等会儿看接下来的代码就知道了。这里判断了钩子函数的结果来决定是否执行写文章这个方法。

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

    @Override
    protected boolean needWriteArticle() {
        return true;
    }

}

设计模式课程实现类,这里重写了钩子函数,将其返回值设置成true。这个提供源代码就算是子类自己的实现。

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;
    }
}

这里是前端课程,因为前端是一个大的区域,前端可以分为vue,react等等,所以我们把这个钩子函数也开放出来,只是给一个默认值让应用层自己实现。

public class TemplateMethodTest {
    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---");


    }
}

测试方法,这就讲完了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web站点优化

Web站点优化

金 / 2009-10 / 55.00元

《Web站点优化》为您提供有效的策略以及精准的技术,让您的网站吸引更多用户,并成功地将他们都转换为最终的购买者。这绝对是现在网络营销成功之路上的指明灯!几年前,所谓“优化过”的网站不过是指加载速度快、兼容绝大多数浏览器而已。而现在,为了提升商业竞争力,网站优化需要做的远不止这些:它需要吸引客户、与客户交互以及说服客户等。 《Web站点优化》就为您提供了众多来自首席专家们的意见,囊括了在线营销......一起来看看 《Web站点优化》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器