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

lambda表达式方法泛型

模板方法模式是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只能包含一个抽象/可自定义任务。

因此,限制为一种抽象方法是一个主要限制,可能不适用于许多实时方案。 我不想重复相同的旧模板方法模式示例,而我写此文件的主要目的是说明在使用单个抽象方法处理抽象类的方案中如何利用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表达式方法泛型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java报错找不到对象,使用Spring源码报错java:找不到类 InstrumentationSavingAgent的问题...

使用Spring源码,报错java:找不到类 InstrumentationSavingAgent报错如下:Error:(26, 38) java: 找不到符号符号: 类 InstrumentationSavingAgent位置: 程序包 org.springframework.instrument解决办法:在自己测试项目的build.gradle里加上 co…

PagingAndSortingRepository –如何与Thymeleaf一起使用

在本教程中&#xff0c;我将演示如何通过分页显示Thymeleaf中的企业客户列表。 1 –项目结构 我们有一个正常的Maven项目结构。 2 –项目依赖性 除了正常的Spring依赖关系之外&#xff0c;我们还添加Thymeleaf和hsqldb&#xff0c;因为我们使用的是嵌入式数据库。 <?x…

php 如何股票曲线图,如何看股票曲线图?股票曲线图讲解

如何看股票曲线图&#xff1f;股票曲线图讲解股票分时图走势图表&#xff1a;乳白色曲线图表明这种个股的分时图交易量价钱。淡黄色曲线图表明这种个股的均价。淡黄色柱线表明每分的交易量&#xff0c;企业为手(100股/手)。下边是分时图走势图表中经常会出现的专有名词及寓意&a…

matlab里方差分析的盒子图怎么看,Matlab方差分析

Matlab 方差分析(T检验)在工农业生产和科学研究中,经常遇到这样的问题:影响产品产量、质量的因素很多,我们需要了解在这众多的因素中,哪些因素对影响产品产量、质量有显著影响.为此,要先做试验,然后对测试的结果进行分析.方差分析就是分析测试结果的一种方法.在方差分析中,把在…

java集合提取最小的日期_提取Java集合的元素-Java 8方法

java集合提取最小的日期我们都广泛使用了Collection类&#xff0c;例如List&#xff0c;Map及其派生版本。 每次使用它们时&#xff0c;我们都必须遍历它们以找到某个元素或更新这些元素&#xff0c;或者找到匹配某个条件的不同元素。 考虑如下所示的人员列表&#xff1a; Lis…

php中的空转为什么意思,php 长期更

php 语法&#xff1a;换行&#xff1a;echo"";echo;"."会连接字符串123.456""等号只判断左右两边的最终结果&#xff0c;而不判断数据类型。""全等于首先判断两边的数据类型是否一致&#xff0c;接着判断最终结果是否一致。“||”“|”…

apache 隐藏php版本,PHP+Apache环境中怎么隐藏Apache版本

PHPApache环境中怎么隐藏Apache版本发布时间&#xff1a;2021-02-08 09:57:43来源&#xff1a;亿速云阅读&#xff1a;104作者&#xff1a;小新小编给大家分享一下PHPApache环境中怎么隐藏Apache版本&#xff0c;相信大部分人都还不怎么了解&#xff0c;因此分享这篇文章给大家…

使用Okta的单点登录保护您的Vert.x服务器

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Vert.x是Spring生态系统中增长最快的元素之一&#xff0c;保护Vert.x服务器可能是一个…

cas java web,CAS干单点登陆(SSO)——集成Java Web 项目

在应用WEB-INF/web.xml添加filter的内容&#xff0c;效果如下所示org.jasig.cas.client.session.SingleSignOutHttpSessionListenerCAS Single Sign Out Filterorg.jasig.cas.client.session.SingleSignOutFilterCAS Single Sign Out Filter/*CASFilterorg.jasig.cas.client.au…

oracle的dtime,Oracle时间函数

YYYY年 Q季度MM月 month月WW当年第几周 W本月第几周DDD 当年第几天 DD当月第几天 D当周内第几天 DY当周内星期几 day当周内星期几HH或HH12:12进制小时数 HH24:24小时制MI:分钟数(0&#xff5e;59) SS:秒数(0&#xff5e;59)1、Sysdate:当前日期和时间Select sysdate from dual2…

Apache Kafka简介

什么是Apache Kafka&#xff1f; Apache Kafka是一个分布式流系统&#xff0c;具有发布和订阅记录流的功能。 在另一方面&#xff0c;它是企业消息传递系统。 它是一个快速&#xff0c;水平可扩展和容错的系统。 Kafka有四个核心API&#xff0c; 生产者API&#xff1a; 该API允…

oracle查看存储过程最近编译,Oracle恢复被误编译覆盖的存储过程

同事在写Oracle存储过程时候&#xff0c;是在以前已经写好的过程基础上修改的&#xff0c;想换个名字&#xff0c;由于疏忽没有改名字就编译了&#xff0c;编译完才意识到。这时原来的那个已经没有了。找我想办法恢复回原来的那个过程。通过查资料想到个方法&#xff0c;也不知…

oracle安装 redo log file,Oracle Dump Redo Log File 说明

关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)使用一. dump redo 说明关于Dump redo log 的示例&#xff0c;MOS 上的文档&#xff1a;[ID 1031381.6] 有详细说明。Dump 有两种方式&#xff1a;(1)…

unity 飞机 残骸模型_训练残骸模式– Java 8中的改进实现

unity 飞机 残骸模型Venkat Subramaniam在今天的演讲中提到了有关“级联方法”模式或“火车残骸”模式的内容&#xff0c;如下所示&#xff1a; >someObject.method1().method2().method3().finalResult()很少有人会将此与构建器模式相关联&#xff0c;但事实并非如此。 无…

datastage配置oracle,IBM Datastage8.5配置问题

大家好&#xff0c;最近因学习需要&#xff0c;在虚拟机REHL5.5上安装了IBM Datastage8.5的服务器端&#xff0c;在windows端安装客户端&#xff0c;调试连接时&#xff0c;提示密码不正确&#xff0c;我修改了密码&#xff0c;重启了服务器&#xff0c;还是提示密码不正确&…

JSON模式在构建和部署API中的作用

什么是JSON模式 &#xff1f; 它提供了描述任何JSON值的结构和属性的详尽方法。 在记录对任何JSON API的请求和响应时&#xff0c;它非常有用。 本文将探讨其在API的软件开发周期中的作用。 记录JSON响应格式 定义数据架构的最明显的用例也许是在记录API响应的结构。 让我们来…

taskctl调oracle存储过程,TASKCTL常见问题和解决方法(FAQ)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼转载自 TASKCTL部分FAQ--技术交流|业界领先ETL批量调度专家系统安装与维护&#xff1a;A1、安装时环境变量已设置&#xff0c;但安装时依然提示环境变量未设置&#xff1f;答&#xff1a;该问题主要是因为环境变量配置未生效。先检…

oracle jet auto,如何启用sqlplus的AutoTrace功能

SQL> set autotrace traceonlySQL> select table_name from user_tables;已选择98行。已用时间: 00: 00: 00.04Execution Plan----------------------------------------------------------0 SELECT STATEMENT OptimizerCHOOSE1 0 NESTED LOOPS2 1 NESTED LOOPS (OUTER)3…

使用Docker构建Oracle ADF应用程序

最近&#xff0c;我的一个好朋友在使用公共Oracle Maven存储库构建ADF应用程序v.12.2.1.2时经常遇到问题。 他要求我检查它是否对我有用。 好吧……没有。 因此&#xff0c;存储库存在一些问题。 为了使实验整洁并避免对我的工作环境造成任何影响&#xff0c;我决定在docker容器…

linux权限c是什么意思,linux服务器下权限设置

1.在终端输入命令 sudo chmod -R 777 /opt/Tomcat,那么Tomcat文件夹和它下面的所有子文件夹的属性都变成了777(读/写/执行权限)2.bin/sh^M&#xff1a;损坏的解释器: 没有那个文件或目录 错误&#xff1f;解决方法&#xff1a;脚本文件保存时使用了DOS格式&#xff0c;用DOS2UN…