Java 8 lambda表达式的简洁性为经典的GoF设计模式提供了新的视角。通过利用函数式编程,我们可以通过更少的耦合获得相同的好处 - 模板方法就是一个很好的例子。

经典的GoF模板方法实现

模板方法设计模式是Gang of Four描述的23种设计模式之一 - 利用它可以轻松地符合Open-Closed和Hollywood原则。简而言之,它有助于定义某个算法的骨架,用户可以填充空白,这是通过覆盖定义骨架实现的抽象类所暴露的抽象方法来实现的。

更实际一点,想象一些场景,比如记录某些操作的执行时间,在事务中运行代码,或者我们负责以前/后测试方法形式填充空白的经典JUnit工作流 - 这些场景都是该模式闪耀之处。让我们看看一个相当简单的例子,它以简单的执行时间记录包围我们的代码。

经过专业训练的GoF设计模式从业者将使用抽象类来实现这个想法:

然后,如果我们想用记录逻辑包装我们的代码片段,我们只需要扩展该类,然后使用public方法:

然而,由于它依赖于继承,这种方法非常具有侵入性 - 它将类紧密地耦合在一起。

用函数简化模板方法

在我们的工具箱中使用新工具,我们可以使用上面的轻量级版本实现类似的效果,而不使用函数式编程思想。 既然我们现在可以传递函数,为什么不在这里做同样的事情呢?因此,我们可以在一个接受功能接口的方法中实现,而不是通过使用抽象类来定义:

现在,每当我们想要选择加入时,只需调用util方法来利用编译时方面的语义即可:

想要编写多个调用? 不是问题:

还可以写在action中,

总结

GoF中充满了规范性的想法,但随着新方法的出现,实现更好的实施,仍然值得重新审视。

java 模板函数_重温Java中的模板方法设计模式相关推荐

  1. java skip函数_【Java必修课】图说Stream中的skip()和limit()方法及组合使用

    1 简介 本文将讲解Java 8 Stream中的两个方法:skip()和limit().这两个方法是Stream很常用的,不仅各自会被高频使用,还可以组合出现,并能实现一些小功能,如subList和 ...

  2. java matcher函数_在Java正则表达式中使用Matcher.end()方法

    方法java.util.regex.Matcher.end()返回根据正则表达式从序列中匹配最后一个字符后的偏移值.此方法不需要任何参数.如果没有匹配发生,或者匹配操作失败,则抛出IllegalSta ...

  3. java main函数_一行JAVA代码如何运行起来?

    在程序员的世界中,你总会听到一句"PHP是世界上最好的语言"的调侃.然而在你进入软件程序开发之后,你会发现即使开发语言千千万,最盛行的还是JAVA.从淘宝的技术变迁中我们可以见一些 ...

  4. java arraylist 函数_使用Java-8中的函数ArrayList

    问题描述: 我希望能够使用从另一个类传入的函数的ArrayList(其中函数已在其他类中定义).如果在一个类中定义了可能具有不同输入和返回类型的函数列表,我希望能够将其中一些的ArrayList(可能 ...

  5. java反转函数_在JAVA中,下列哪个函数可用于字符串的反转?

    在JAVA中,下列哪个函数可用于字符串的反转? 更多相关问题 很多危机是无法准确预测的,必须为危机做好准备,包括().通信计划以及重要关系的建立等. (A) 危 幼儿园科技小制作可分为模型类.动力类. ...

  6. java string()函数_从Java中的String函数返回String构建器?

    我有以下程序,我必须将字符串附加到另一个字符串,我使用字符串构建器以标准方式执行.但是,即使在将其转换为toString()之后,该函数也不允许我返回ab.我想问为什么? import java.ut ...

  7. java封装函数_关于java中函数功能的封装

    //Triangle类,用于封装Triangle的属性及功能. package qing; public class Triangle { double sideA,sideB,sideC,area, ...

  8. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  9. java cos函数_【Java案例】余弦函数

    前面介绍的余弦曲线的绘制,我们看到的是一个完整的静态图形,能否动态地展现绘制的过程?答案是肯定的,我们可以采用线程的方式来实现,参考代码如下: import java.applet.Applet; i ...

最新文章

  1. Field Service Center Customization
  2. Pocket Hacking: NetHunter实战指南
  3. 活体检测方法概述与总结
  4. Oracle SQL Parsing Flow Diagram(SQL 解析流程图)
  5. 转 最小生成树(kruskal 算法 和prim算法)
  6. Ace Admin 学习笔记
  7. thinkphp的find()方法获取结果
  8. 设置广告 php,设置ecshop广告位
  9. 为Vue2集成UIkit
  10. Atitti.数字证书体系cer pfx attilax总结
  11. Xmind模板文档分享——生活计划(3)
  12. 【CVPR2022】论文列表与下载——PartFour
  13. PS修皮肤去痘痘毛孔,只需要掌握这个技巧就够了
  14. Linux内核info leak漏洞
  15. select句柄数限制 及总结
  16. 【Unity Shader 描边效果_案例分享】
  17. android话费查询接口,Android 小应用--一键查话费移动版(附源码)
  18. 四大主流CA机构——国产占据其一
  19. 2020Kali开机配置(中文输入法等)
  20. 五位来自五大洲的杰出女性荣获联合国教科文组织“世界杰出女科学家成就奖” | 周末...

热门文章

  1. 阿里云服务器+腾讯域名进行域名解析
  2. 大数据时代下的计算机和互联网
  3. 计算机研究生论文写作 问题记录
  4. 计算机视觉论文-2021-08-02
  5. android 读取手机存储数据恢复,Android智能手机数据恢复方法浅析
  6. android手机自带软件,为什么安卓手机的预装软件这么多
  7. 传奇M2server用到的文件一些txt或Ini文件解释说明(整理中……)
  8. JAVA跨考_考研人的2019——一战跨考清华计算机的血泪史
  9. IMU之磁力计校准地磁场计算磁航向
  10. java 操作 word 表格和样式_java 处理word文档 (含图片,表格内容)