模板方法模式

一、模板方法模式介绍

1、定义与类型

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

2、适用场景

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

3、优点

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

4、缺点

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

5、扩展

钩子方法

6、相关设计模式

模板方法模式和工厂方法模式

模板方法模式和策略模式
策略模式是使不同的算法可以相互替换,并且不影响应用层客户端的使用,可以改变算法的流程;而模板方法模式是针对顶一个算法的流程,将一些不太一样的步骤交给子类去实现,不改变算法的流程

二、代码示例

模拟场景:制作课程,有些步骤和操作是固定的,但打包的时候每个课程都有自己的打包方式,并且课程不一定有手记

课程抽象类:

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

课程实现类1:

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

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

课程实现类2:

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

测试类:

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

三、源码示例

1、JDK中的AbstractList

AbstractSet、AbstractMap同理

2、tomcat中的HttpServlet

(0)

相关推荐

  • 行为型模式之模板方法

    在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关. 例如,一个 ...

  • 快速掌握模板方法模式

    概述 模板模式就是定义一个操作中的算法骨架,然后将一些步骤延迟到子类中.模板方法使得子类在不改变算法的结构即可重定义该算法的某些步骤. 使用场景 泡茶 我们都知道泡茶基本步骤有: 烧水.选茶叶.泡茶. ...

  • 设计模式-行为型-模板模式

    模板模式(Template): 提到模板,可能大多数人想到的是"简历模板"."论文模板"等,比如我们要写简历时,会从网上下载一份漂亮的简历模板,其格式是固定的, ...

  • 设计模式(14) 模板方法模式

    模板方法模式 模板方法模式是面向对象系统中非常朴实的一种模式,体现出面向对象设计中继承和多态的基本特征.在开发应用的过程中,往往会在初期规划一些较粗粒度的算法,而且对参与计算的对象进行抽象,明确算法会 ...

  • JAVA架构师之路十四:设计模式之模板模式

    JAVA架构师之路十三:设计模式之委派模式 模板模式 1. 模板模式 2. 模板模式案例 3. JDBC模板模式 没有意志,理想便是幻想. 1. 模板模式 定义 通常又叫模板模式,是指定义一个算法的骨 ...

  • 图解Java设计模式之模板模式

    豆浆制作问题 模板方法模式基本介绍 模板方法模式原理类图 模板方法模式解决豆浆制作问题 模板方法模式的钩子方法 模板方法模式在Spring框架中的源码分析 模板方法模式的注意事项和细节 豆浆制作问题 ...

  • 无废话设计模式(12)行为型模式--模板方法模式

    0-前言 模板方法模式定义:定义一个操作中的算法骨架,而将一些步骤延迟到子类中: 模板方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些步骤: 1-实现 1-1.简单UML图:  1-2 ...

  • 设计模式之模板方法

    模板方法模式 Template Method Intro 模板方法模式,定义一个操作中的算法骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算的结构即使重定义该算法的某些特定步骤 这里的 ...

  • 【4/25】在页面对象中启用模板方法模式(Template Method Pattern)

    这是<小游戏从0到1设计模式重构>系列内容第4篇,所有源码及资料在"程序员LIYI"公号回复"小游戏从0到1"获取. 上一小节我们应用了组合模式,对 ...

  • PHP设计模式之模板方法模式

    PHP设计模式之模板方法模式 模板方法模式,也是我们经常会在不经意间有会用到的模式之一.这个模式是对继承的最好诠释.当子类中有重复的动作时,将他们提取出来,放在父类中进行统一的处理,这就是模板方法模式 ...

  • [PHP小课堂]PHP设计模式之模板方法模式

    [PHP小课堂]PHP设计模式之模板方法模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • TemplateMethodPattern模板方法模式

    模板方法模式 1.定义 定义一个操作中的算法的框架,而将一些步骤的实现延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 使用模板方法模式制造两款汽车.定义汽车必须有的特质 ...

  • 大话设计-模板方法模式

    在基类定义算法的结构,具体实现延迟到子类. using System; namespace ConsoleApp2 { class Program { static void Main(string[ ...

  • 设计模式之模板方法模式实战解析

    本文微信公众号「AndroidTraveler」首发. 背景 最近在看<设计模式之禅>,为了能够更加深入的理解设计模式,达到学以致用. 这边记录一下自己的一些感受和看法,并结合具体代码实战 ...

  • 设计模式之模板方法模式(二)

    上一篇我们已经学会了模板方法模式,这次我们继续来深入学习下.毕竟学会只是第一步,还有更进一步的学习和深入等着我们呢. 我们先来看下,对模板方法模式的一个总结的类图: 让我们细看抽象类是如何被定义的,包 ...