Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式之模板方法模式

设计模式之模板方法模式

作者头像
Dylan Liu
发布于 2019-08-23 12:13:06
发布于 2019-08-23 12:13:06
46700
代码可运行
举报
文章被收录于专栏:dylanliudylanliu
运行总次数:0
代码可运行

简介

模板方法模式(Template Method Pattern)隶属于设计模式中的行为型模式,与策略模式一样,是在平常编码过程最常用的模式之一,理念也很简单明确:老大制定流程,具体执行由小弟接手。

模式定义

模版方法模式:在一个方法中定义了一个算法的骨架或者步骤,而将一些步骤延迟到子类中去实现。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某一些步骤。

模板方法模式也是关于算法的,不过模板方法侧重与定义算法的骨架,即算法如何做的流程,而将每一个具体步骤的实现决定权交给子类。

角色

模板方法模式包含三种角色:使用方、抽象模板父类,具体子类实现。

模板方法只是使用了继承和多态,模板在定义操作步骤时实际上也已经将每一个步骤要遵守的规约也定好了,因此具体子类在重写父类方法要注意符合里氏替换原则。

模式说明

我们以早上从起床到上班为例,起床,刷牙,整理书包,坐交通工具到公司,这是一个很常见的流程,至于用什么牙膏,坐地铁还是公交车都不是流程所关心的,细节由子类来补充。这里我们刷牙有一个默认方法,交通方法交由子类决定。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class GotoWork {
    public final void go() {
        wakeup();
        brush();
        arrage();
        takeVehicle();
    }
    
    protected void wakeup() {
        System.out.println("open your eyes!");
    }
    
    protected abstract void brush() {
        System.out.println("brush your teeth");
    }
    protected abstract void arrage() {
        System.out.prinln("arrage bed and bag");
    }
    protected abstract void takeVehicle();
}

某一天我们坐公交车去到了公司

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class BusGotoWork {
    @Override
    public void takeVehicle() {
        System.out.println("take a bus");
    }
}

也可以坐班车:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ScheduledBusGotoWork {
    @Override
    public void takeVehicle() {
        System.out.println("take a scheduledbus");
    }
}

使用直接使用父类提供的对外接口,然后就会走完所有流程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        // 坐班车
        GotoWork gotoWork = new ScheduledBusGotoWork();
        gotoWork.go();
        
        // 坐公交车
        GotoWork gotoWork1 = new BusGotoWork();
        gotoWork1.go();
    }
}

与其他设计模式配合使用

  1. 模板方法也是用于描述算法的,会有多个不同的算法实现,因此可以和创建型模式比如简单工厂方法模式、单例模式等配合使用甚佳。
  2. 桥接模式,上面的例子中刷牙和坐车这两个场景会有很多实现,直接在子类中写会显得臃肿且职责不清,可以将这两种抽离出来单独做成策略,然后桥接过来。
  3. 观察者模式,模版方法在某个事件发生后可以触发事件,由观察者来处理对应事件。
  4. 混合使用,具体场景具体分析

使用场景

适合于流程固定而具体处理步骤不同的场景。日常使用也很常见。

具体例子:

  1. Spring 的 AbstractApplicationContextrefresh 方法
  2. Java 中的 AbstractList 中的 addAll 等方法

优点

  • 封装流程,便于统一处理
  • 流程复用,可以减少子类代码量
  • 符合开闭原则,新增子类方便

缺点

  • 子类需要了解父类提供的可覆盖的方法,并且要小心遵守规约
  • 类增多
  • 流程追踪复杂,在子类和父类之间跳来跳去,加大寻找问题难度

最佳实践

流程中定义钩子方法,可由子类自由决定是否需要覆盖

上面的例子中只有两类方法:抽象方法和具体方法,模板模式中还存在第三种类型方法:钩子方法。

钩子方法是定义在父类中的空方法,这个方法并不是流程必须的,而是提供给子类一个处理的时机,便于子类自行定义,执行一些子类特定的操作。这也是为了不破坏父类流程的封装性。

在Java HashMap 中可以看到三个钩子方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    void afterNodeAccess(Node<K,V> p) { }
    void afterNodeInsertion(boolean evict) { }
    void afterNodeRemoval(Node<K,V> p) { }

流程方法可定义为 final

如果某个流程是确定的,不能让子类擅自修改,那么可以将模板方法定义成 final的,防止人为错误。

一个反面例子是Java 的 ClassLoader 提供了类的加载模板, 即检查未加载过 ---> 父类classloader 未加载到 ----> 子类加载,但却没有将方法设成 final 的,其实子类是不应该破坏类加载的双亲委派模型的。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式实战-模板模式,代码复用神器
模板模式(Template Pattern)又被称作模板方法模式(Template Method Pattern),它是一种简单的、常见的且应用非常广泛的模式。
架构师修炼
2020/07/17
9120
【Java设计模式】018-模板方法模式
模板方法模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
訾博ZiBo
2025/01/06
890
Java设计模式-模板方法模式
说到模板方法模式,它可能是一个让我们深入骨髓而又不自知的模式了,因为它在我们开发过程中会经常遇到,并且也非常简单。只不过,很多时候我们并不知道它就是模板方法模式而已。不负责任的说,当我们用到override关键字重写父类方法的时候,十有八九就跟模板方法模式有关了。
宁在春
2022/10/31
3470
Java设计模式-模板方法模式
Java设计模式(十四)----模板方法模式
模板方法模式 一、概述 二、结构 三、具体案例 四、优缺点和设计思想 一、概述 模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意 二、结构  模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术。   模板方法模式需要开发抽象类和具体
汤高
2018/01/11
8880
Java设计模式(十四)----模板方法模式
设计模式-从你的日常理解模板方法
模板方法可以认为是23种设计模式中最简单的一种了,并且生活中能找到很多的场景。模板方法虽然简单但是有些细节我们还是不能忽视的。
不一样的科技宅
2020/11/10
3230
06-01-设计模式 模板方法模式
选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的(红豆、花生豆浆。。。)
彼岸舞
2022/05/28
1720
06-01-设计模式 模板方法模式
模板方法模式
概述 概念:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。模板方法模式属于行为类模式。 模板方法的组成 类图: 如图所示
xiangzhihong
2018/02/05
6910
模板方法模式
[设计模式] 模板方法模式
模板方法模式比较简单,或者说比较常用.在开发过程中,许多人在不知不觉的情况下就会使用,只要他具有良好的面对对象思维.
呼延十
2019/06/26
3570
[设计模式] 模板方法模式
一文搞懂设计模式—模板方法模式
模板方法模式(Template Method Pattern),又叫模板模式(Template Pattern),是一种行为设计模式,它定义了一个操作中的算法框架,将某些步骤的具体实现留给子类。通过模板方法模式,我们可以在不改变算法结构的情况下,允许子类重新定义某些步骤,从而实现代码复用和扩展。
BookSea
2024/02/29
3440
一文搞懂设计模式—模板方法模式
图解Java设计模式之模板模式
1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的 4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。
海仔
2020/04/01
4250
图解Java设计模式之模板模式
设计模式4之模板方法模式
在开发中,你肯定有遇到过这样一种场景:你知道某个方法的关键步骤以及执行顺序,但是里面有的具体步骤并清楚。你会怎么做?
Lvshen
2022/05/05
1890
设计模式4之模板方法模式
设计模式 | 模板方法模式及典型应用
在程序开发中,经常会遇到这种情况:某个方法要实现的算法需要多个步骤,但其中有一些步骤是固定不变的,而另一些步骤则是不固定的。为了提高代码的可扩展性和可维护性,模板方法模式在这种场景下就派上了用场。
小旋锋
2019/01/21
1.3K0
模板方法设计模式解读
编写制作豆浆的程序,说明如下: 1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3) 选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一样的 4) 请使用 模板方法模式 完成 (说明:因为模板方法模式,比较简单,很容易就想到这个方案,因此就直接使用,不再使用传统的方案来引出模板方法模式 )
一个风轻云淡
2023/10/15
1330
模板方法设计模式解读
设计模式----模板方法模式
模板方法模式: 在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使子类在不改变算法结构的情况下,重新定义算法中的某些步骤。 模板方法模式的结构: 抽象类:实现了模板方法,定义了算法的骨架。 具体类:实现抽象类中的抽象方法,已完成完整的算法。 这个模式是用来创建一个算法的模板。这个模板将算法定义为一组步骤,其中任何步骤都可以是抽象的,由子类负责实现。很多框架都是采用模板方法模式。 示例:星巴兹冲泡咖啡和茶的步骤如下: 咖啡冲泡法: 把水煮沸 用沸水冲泡咖啡
SuperHeroes
2018/05/30
4350
『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
主要解决 当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。
风骨散人Chiam
2020/10/28
4010
设计之禅——模板方法模式
模板方法模式在我们平时开发中是非常常见,也是非常容易理解的,在平时不经意间就会使用到,因此理解其设计思想是非常有必要的。
夜勿语
2020/09/07
3530
模板方法模式(Template Method)
模板方法模式(Template Method) 定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类图: 模板方法模式是编程中经常用到
qubianzhong
2019/07/01
4640
模板方法模式(Template Method)
设计模式——模板方法模式
● 1.定义了一个或多个抽象操作,以便让子类实现。这些抽象操作叫做基本操作,它们是一个顶级逻辑的组成步骤。
蜻蜓队长
2018/08/03
4120
设计模式——模板方法模式
设计模式(11)——模板方法模式(Template Method Pattern,行为型)
模板方法模式(Template Method Pattern)属行为型,在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中,使子类可以不改变算法结构即可重定义算法的某些特定步骤。
恋喵大鲤鱼
2018/08/03
4530
设计模式(11)——模板方法模式(Template Method Pattern,行为型)
设计模式-模板方法模式
在实现模板方法模式时,开发抽象类的软件设计师和开发具体子类的软件设计师之间可以进行协作。一个设计师负责给出一个算法的轮廓和框架,另一些设 计师则负责给出这个算法的各个逻辑步骤。实现这些具体逻辑步骤的方法即为基本方法,而将这些基本方法汇总起来的方法即为模板方法,模板方法模式的 名字也因此而来。下面将详细介绍模板方法和基本方法:
码哥字节
2021/07/27
2620
推荐阅读
相关推荐
设计模式实战-模板模式,代码复用神器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验