模板方法模式是Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides在著名的《 设计模式》一书中解释的23种设计模式之一。 这种模式的意图表示为:

在操作中定义算法的框架,将某些步骤推迟到子类。 TemplateMethod允许子类重新定义算法的某些步骤,而无需更改算法的结构。

为了简单地解释,请考虑以下情形:假设有一个工作流系统,其中必须以给定的顺序执行4个任务才能成功完成工作流。 4个任务中的一些任务可以通过以下方式自定义
不同的工作流程系统实施。

通过将工作流系统封装到一个抽象类中,而实现的4个任务中只有很少的任务,可以将模板方法模式应用于上述场景。 将其余任务的实现留给抽象类的子类。

所以上面的实现时:

/*** Abstract Workflow system*/
abstract class WorkflowManager2{public void doTask1(){System.out.println("Doing Task1...");}public abstract void doTask2();public abstract void doTask3();public void doTask4(){System.out.println("Doing Task4...");}
}/*** One of the extensions of the abstract workflow system*/
class WorkflowManager2Impl1 extends WorkflowManager2{@Overridepublic void doTask2(){System.out.println("Doing Task2.1...");}@Override public void doTask3(){System.out.println("Doing Task3.1...");}
}/*** Other extension of the abstract workflow system*/
class WorkflowManager2Impl2 extends WorkflowManager2{@Overridepublic void doTask2(){System.out.println("Doing Task2.2...");}@Override public void doTask3(){System.out.println("Doing Task3.2...");}
}

让我继续说明如何使用这些工作流程实现:

public class TemplateMethodPattern {public static void main(String[] args) {initiateWorkFlow(new WorkflowManager2Impl1());initiateWorkFlow(new WorkflowManager2Impl2());}static void initiateWorkFlow(WorkflowManager2 workflowMgr){System.out.println("Starting the workflow ... the old way");workflowMgr.doTask1();workflowMgr.doTask2();workflowMgr.doTask3();workflowMgr.doTask4();}
}

和输出将是..

Starting the workflow ... the old way
Doing Task1...
Doing Task2.1...
Doing Task3.1...
Doing Task4...
Starting the workflow ... the old way
Doing Task1...
Doing Task2.2...
Doing Task3.2...
Doing Task4...

到目前为止,一切都很好。 但是,本文的主要目的不是创建有关Template Method模式的另一篇博客文章,而是了解如何利用Java 8 Lambda Expression和Default Methods 。 我之前已经写过,只有具有单一抽象方法的接口才能被编写为lambda表达式。 在此示例中,这意味着在四个任务中,WorkflowManager2只能包含一个抽象/可自定义任务。

因此,限制为一种抽象方法是一个主要限制,可能不适用于许多实时方案。 我不希望重复相同的旧Template Method模式示例,而我写这篇文章的主要目的是说明在用单个抽象方法处理抽象类的情况下如何利用lambda表达式和默认方法。

如果您想知道Java中的这些lambda表达式以及Java中的这些默认方法是什么意思,那么在继续之前,请花一些时间来阅读有关lambda表达式和默认方法的信息 。

我们将使用具有默认方法的接口来代替抽象类,因此我们的工作流系统将如下所示:

interface WorkflowManager{public default void doTask1(){System.out.println("Doing Task1...");}public void doTask2();public default void doTask3(){System.out.println("Doing Task3...");}public default void doTask4(){System.out.println("Doing Task4...");}
}

现在,我们有了带有可自定义Task2的工作流系统,我们将继续使用Lambda表达式启动一些自定义工作流…

public class TemplateMethodPatternLambda {public static void main(String[] args) {/*** Using lambda expression to create different * implementation of the abstract workflow*/initiateWorkFlow(()->System.out.println("Doing Task2.1..."));initiateWorkFlow(()->System.out.println("Doing Task2.2..."));initiateWorkFlow(()->System.out.println("Doing Task2.3..."));}static void initiateWorkFlow(WorkflowManager workflowMgr){System.out.println("Starting the workflow ...");workflowMgr.doTask1();workflowMgr.doTask2();workflowMgr.doTask3();workflowMgr.doTask4();}
}

这是可以在模板方法模式中利用lambda表达式的一种小方法

参考: 模板方法模式–使用Lambda表达式,来自JCG合作伙伴 Mohamed Sanaulla的默认方法,来自Experiences Unlimited博客。

翻译自: https://www.javacodegeeks.com/2013/05/template-method-pattern-using-lambda-expressions-default-methods.html

模板方法模式–使用Lambda表达式,默认方法相关推荐

  1. lambda表达式方法泛型_模板方法模式–使用Lambda表达式,默认方法

    lambda表达式方法泛型 模板方法模式是Erich Gamma,Richard Helm,Ralph Johnson和John Vlissides在著名的< 设计模式>一书中解释的23种 ...

  2. Java8 之 lambda 表达式、方法引用、函数式接口、默认方式、静态方法

    今天我来聊聊 Java8 的一些新的特性,确实 Java8 的新特性的出现,给开发者带来了非常大的便利,可能刚刚开始的时候会有点不习惯的这种写法,但是,当你真正的熟悉了之后,你一定会爱上这些新的特性的 ...

  3. Java8 新特性:Lambda 表达式、方法和构造器引用、Stream API、新时间与日期API、注解

    Java8新特性:Lambda 表达式.方法和构造器引用.Stream API.新时间与日期API.注解 1.Java8新特性 1.1.主要的新特性: 1.2.编程风格 2.Lambda 表达式 2. ...

  4. JAVA学习笔记 15 - 函数式接口、Lambda表达式和方法引用

    本文是Java基础课程的第十五课.主要介绍在JDK8中,Java引入的部分新特性,包括函数式接口.Lambda表达式和方法引用.这些新特性使得Java能够在按照面向对象思想进行开发的基础上,融合函数式 ...

  5. 如何在Java 8中将Lambda表达式转换为方法引用?

    如果您使用Java 8进行编码,那么您会知道使用方法引用代替lambda表达式会使您的代码更具可读性,因此建议尽可能使用方法引用替换lambda表达式,但是,最大的问题是,您如何查找是否可以用方法引用 ...

  6. java list作为参数传递_Java 程序将lambda表达式作为方法参数传递

    Java 程序将lambda表达式作为方法参数传递 在此示例中,我们将学习将lambda表达式作为Java中的方法参数传递. 要理解此示例,您应该了解以下Java编程主题: 示例1:将lambda表达 ...

  7. 【Java从入门到头秃专栏 7】语法篇(六) :Lambda表达式(->) 方法引用(::) stream流

    目录 1 Lambda表达式( -> ) ​ 2 方法引用( :: ) 3 Stream流 接下来介绍的三种语法叫:Lambda表达式 方法引用 stream流,这三种语法的使用要有特定条件,在 ...

  8. .net mvc lambda表达式Contains方法

    Lambda表达式Contains方法(等价于SQL语句中的like)使用注意事项: 众所周知,想在EntityFrame实体框架中使用类似于SQL语句中like的效果时就的使用Contains方法了 ...

  9. lambda表达式与方法引用

    lambda 表达式 λ 属于匿名函数代码,使用箭头操作符 -> 左边是参数列表,右边是方法体 (参数类型 参数,···) -> {代码块}即使没有参数,也要提供空括号,就像是无参方法一样 ...

最新文章

  1. 5G NR中物理层信号传输过程
  2. Struts2 学习系列 (2) 访问web资源
  3. es6严格模式需要注意的地方
  4. .net core image怎么保存_C# 将PDF转为多种Image图像文件格式(Png/Bmp/Emf/Tiff)
  5. python是动态语言_Python是动态语言:动态添加或删除属性、方法
  6. ffmpeg获取h264视频数据
  7. pta 习题集 5-2 找出不是两个数组共有的元素 (5分)
  8. uni-app 获取手机状态栏高度
  9. nds linux模拟器下载,NDS模拟器Desmume
  10. 日期格式化java_JAVA格式化时间日期
  11. 【修正版】狼叔的2017年总结:
  12. 【经验总结】CS与MSF之间的会话传递
  13. 思途旅游CMS短信宝短信插件
  14. linux中zlib源码包安装
  15. 计算机专业处理器和显卡,45.显卡篇-处理器显卡和独立显卡哪个好-电脑自学网...
  16. GPG在PHP中的使用
  17. 迁移WSL时的报错:0x80073d21 此应用的发布者不允许将其移动到其他位置
  18. 团队协作出了问题,项目经理怎么办?
  19. C语言 两个整数的四则运算
  20. 2022化工自动化控制仪表特种作业证考试题库及在线模拟考试

热门文章

  1. php access allow,PHP标头不适用于Access-Control-Allow-Origin
  2. 如何导入hadoop源码到eclipse
  3. spring order_Spring @Order批注
  4. ssrs 基于表达式显示_基于表达式的访问控制
  5. enum.values_占用内存的Enum.values()方法
  6. java分页中显示更多_早期更多失败– Java 8
  7. java javadoc_使用Java 9向Javadoc搜索添加术语
  8. json api_JSON模式在构建和部署API中的作用
  9. java 代码运行速度慢_C代码的运行速度总是比Java快,对吧? 错误!
  10. concurrency_Java Concurrency Essentials教程