设计模式之美
王争
前 Google 工程师,《数据结构与算法之美》专栏作者
123425 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 113 讲
设计模式与范式:行为型 (18讲)
设计模式之美
15
15
1.0x
00:00/00:00
登录|注册

58 | 模板模式(上):剖析模板模式在JDK、Servlet、JUnit等中的应用

作用
经典实现
定义
JUnit TestCase
Java Servlet
Java AbstractList
Java InputStream
示例代码
定义
课堂讨论
重点回顾
作用二:扩展
作用一:复用
原理与实现
模板模式

该思维导图由 AI 生成,仅供参考

上两节课我们学习了第一个行为型设计模式,观察者模式。针对不同的应用场景,我们讲解了不同的实现方式,有同步阻塞、异步非阻塞的实现方式,也有进程内、进程间的实现方式。除此之外,我还带你手把手实现了一个简单的 EventBus 框架。
今天,我们再学习另外一种行为型设计模式,模板模式。我们多次强调,绝大部分设计模式的原理和实现,都非常简单,难的是掌握应用场景,搞清楚能解决什么问题。模板模式也不例外。模板模式主要是用来解决复用和扩展两个问题。我们今天会结合 Java Servlet、JUnit TestCase、Java InputStream、Java AbstractList 四个例子来具体讲解这两个作用。
话不多说,让我们正式开始今天的学习吧!

模板模式的原理与实现

模板模式,全称是模板方法设计模式,英文是 Template Method Design Pattern。在 GoF 的《设计模式》一书中,它是这么定义的:
Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

模板模式在Java开发中的应用是本文的重点。通过分析Java Servlet、JUnit TestCase、Java InputStream、Java AbstractList等实际例子,深入讲解了模板模式的原理与实现。模板模式的作用主要包括复用和扩展两个方面。在复用方面,模板模式将不变的流程抽象到父类的模板方法中,可变的部分留给子类实现,实现了代码的复用。在扩展方面,模板模式提供了扩展点,让框架用户可以在不修改框架源码的情况下,定制化框架的功能。通过具体的例子如Java Servlet和Java InputStream的分析,展示了模板模式在框架开发中的应用。文章通过清晰的代码示例和实际应用场景,帮助读者深入理解模板模式的原理和实现,以及在Java开发中的实际应用。模板方法模式在一个方法中定义一个算法骨架,并将某些步骤推迟到子类中实现,实现了算法的复用和扩展。模板模式有两大作用:复用和扩展。其中,复用指的是,所有的子类可以复用父类中提供的模板方法的代码。扩展指的是,框架通过模板模式提供功能扩展点,让框架用户可以在不修改框架源码的情况下,基于扩展点定制化框架的功能。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《设计模式之美》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(112)

  • 最新
  • 精选
  • Geek_cead38
    我觉得即便是使用装饰器还是直接重写method1-4,对于需要子类重写的方法要么抛不支持异常,要么抽象,不然子类察觉不到必须重写,导致模板函数的业务出错

    作者回复: ������

    2020-11-22
    3
    3
  • Laughing
    结尾问题有两种解决方法: 1. 写适配器来转化 2. 提供默认实现不要求强制实现

    作者回复: ������

    2020-11-24
  • 攻城拔寨
    文末的问题,在 spring 生命周期中,InstantiationAwareBeanPostProcessorAdapter 就是解决这个问题的。 写个适配器,把所有抽象方法默认实现一下,子类继承这个 adapter 就行了。
    2020-03-17
    16
    230
  • Eclipse
    可以借鉴AbstractList的addall实现。提供默认的方法method1...method4方法,每个方法直接抛出异常,使用模板方法的时候强制重写用到的method方法,用不到的method不用重写。
    2020-03-16
    10
    107
  • Rayjun
    如果两个模版方法没有耦合,可以拆分成两个类,如果不能拆分,那就为每个方法提供默认实现
    2020-03-16
    73
  • 最好的狗焕啊
    争哥,一年前就很崇拜你了,但是现在很迷茫,三年的开发经验了,一直在小公司,做的项目最多的数据量也只是十几万的用户,平常下班每天都会坚持学习两个小时,已经坚持一年半了,看了数据结构和算法,还有认真刷过题,看了网络协议,也看了框架方面的书等等,也认真做了笔记,然后想投递独角兽公司,但是简历都不通过,理由是学历和项目都没有亮点,我是本科毕业,看了网上的一些阿里或者百度这样的公司的面试题,发现自己也会,但是投递的简历都不通过,真的很迷茫,不知道这样的坚持有没有用,现在想回到老家一个二线城市,做着一份养老的工作
    2020-03-17
    43
    52
  • tt
    参考装饰器模式那一课中JAVA IO类库中的做法,引入一个中间父类,实现所有的抽象方法,然后再让业务类去继承这个中间的父类。
    2020-03-17
    26
  • 每天晒白牙
    提供一个 Base 类,实现 method1 到 method4 的所有抽象方法,然后子类继承 Base 类,一般可以直接复用 Base 类中的 method1 到 method4 方法,如果需要重写,直接重写该方法就好。这样就能省去所有子类实现所有抽象方法 继承抽象方法的基类 Base public class Base extends AbstractClass { @Override protected void method1() { System.out.println("1"); } @Override protected void method2() { System.out.println("2"); } @Override protected void method3() { System.out.println("3"); } @Override protected void method4() { System.out.println("4"); } } 子类 A 需要重写 method1 方法 public class SubA extends Base { // 只需要重写 method1 @Override public void method1() { System.out.println("重写 method1"); } public static void main(String[] args) { Base A = new SubA(); A.templateMethod1(); } } 输出结果为 重写 method1 2
    2020-03-16
    26
  • 小兵
    父类中不用抽象方法,提供一个空的实现,子类根据需要重写。
    2020-03-16
    3
    17
  • 下雨天
    课后思考: 一. 能修改框架代码情况: 定义一个父类,给不需要调用的抽象方法一个默认实现,子类继承该父类。 二. 如果可以修改框架代码的情况下: 1.templateMethod1与templateMethod2相关:可以将不需要调用的方法修改成protected并提供默认空实现。 2.templateMethod1与templateMethod2不相关:接口隔离原则,考虑将AbstractClass拆分成两个类分别定义两个方法。
    2020-03-16
    10
收起评论
显示
设置
留言
99+
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部