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

因此,限制为一种抽象方法是一个主要限制,可能不适用于许多实时方案。 我不希望重复相同的旧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

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

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

相关文章

DOM元素属性值如果设置为对象

结论:内部会调用toString方法,将设置的对象转换为字符串添加给相应的属性; 这个问题呢,是通过jQuery的each方法中,回调函数的this指向问题而来; 我们知道,回调函数中的this如果指向的是基本数据…

纯CSS3美化单选按钮radio

这种纯CSS3美化单选按钮radio的方法适用于以下情况: 1、可兼容IE9以上,需要兼容IE8的要写IE的hack把样式去掉 2、只支持单选按钮radio,因为单选按钮选中样式的圆圈可以用CSS做出来,但是复选按钮checkbox的选中效果对勾就需要图片…

【洛谷】【二分答案+最短路】P1462 通往奥格瑞玛的道路

在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量有一天他醒来后发现自己居然到了联盟的主城暴风城在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目背景【题目描述:】 在艾泽拉斯,有n个城市。编号为1…

模拟智能手环的时间显示功能 c语言,HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDF...

HT1635AHT1635B在穿戴式运动手环的LED显示之C语言版.PDFHT1635A/HT1635B 在穿戴式运动手环的LED 显示之C 语言版应用范例HT1635A/HT1635B 在穿戴式运动手环的LED 显示之C 语言版应用范例文件编码:AN0443S简介HT1635A/HT1635B是HOLTEK开发的一款带显示数据映像储存器…

训练残骸模式– Java 8中的改进实现

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

px、em、pt之间的区别与互相转换

关于px、pt和em的区别,自己有时候也会纠结到底该用什么单位,今天特意查了一些文章,下面这篇虽然很久远了,但解释的比较全面,转载收藏之。点击查看原文(原网址已失效,这是其他站点) …

3.Apache ZooKeeper数据模型

1. ZooKeeper自下向上的服务视图 Apache ZooKeeper是分布式应用程序的协调服务。 它旨在解决分布式应用程序中与组件协调相关的棘手问题。 它通过暴露一个简单而强大的接口来实现这一点。 应用程序可以设计在通过ZooKeeper API实现的这些接口上,以解决分布式同步&am…

STS插件_ springsource-tool-suite插件各个历史版本

目前spring官网(http://spring.io/tools/sts/all)上可下载的spring插件只有:springsource-tool-suite-3.8.4(sts-3.8.4)。但这只针对指定的eclipse版本适用。 原贴更精彩:http://blog.csdn.net/u010203767/article/details/69211072 sts-3.8.3的下载地址…

c语言中空格的占位符,HTML空格占位符

ScrollView 里的 EditText 与输入法的用例情景是这样的: 我希望页面可以滚动,因为长页面,内容多,必须滚动来满足不同手机的显示 点击 EditText 输入法弹出来,并将布局顶起来,并且EditText有足够的显示空间 进入页面时,输入法不能 ...decltype在C中,decltype作为操作符,用于查询…

仔细看看,您会发现需要改进的地方

我建议您做一个练习:明天早上返回工作时,浏览项目的源代码,并尝试寻找重构的机会。 即使您的老板不要求也这样做。 这样做是因为您想要一些激动人心的工作时间。 重构是改变已经可以正常工作的艺术 。 但是要进行重构,您需要一个…

idea运行项目时报Error:java无效的源发行版:1.8

如果你安装的是JDK1.7,而在file->project structure中设置的是language level是8的话,就会出现这个错误提示:无效的源发行版:8。 解决办法:将语言级别改为7,或6。即语言级别不能高于你安装的版本。 另外…

0x123C语言,and esp, 0xfffffff0

问题I dont entirely understand the line with comment in it below. I read a few posts on SO and in the gcc manual and learned that it is for stack address alignment but fail to understand how it does so. The code is show below:(gdb) disas mainDump of assemb…

JUnit:在参数化测试中命名单个测试用例

几年前,我写了有关JUnit参数化测试的文章 。 我不喜欢它们的一件事是JUnit使用数字命名了单个测试用例,因此,如果它们失败,您将不知道是哪个测试参数导致了失败。 以下Eclipse屏幕快照将向您展示我的意思: 但是&#…

如何在 React Native 中写一个自定义模块

前言 在 React Native 项目中可以看到 node_modules 文件夹,这是存放 node 模块的地方,Node.js 的包管理器 npm 是全球最大的开源库生态系统。提到npm,一般指两层含义:一是 Node.js 开放式模块登记和管理系统,另一种是…

小程序canvasu真机上数据图片不能使用

canvas遇到的坑 1.文字换行 2.真机不能使用网络数据图片(真坑) 点击显示效果我就不写了,你们可以自己加一下 全部代码贴出来 css#preview {width: 100%;height: 100%;background: rgba(0, 0, 0, 0.6);position: fixed;z-index: 999;top: 0;ov…

c语言 两条线段位置,C++/STL实现判断平面内两条线段的位置关系代码示例

概念平面内两条线段位置关系的判定在很多领域都有着广泛的应用,比如游戏、CAD、图形处理等,而两线段交点的求解又是该算法中重要的一环。本文将尽可能用通俗的语言详细的描述一种主流且性能较高的判定算法。外积,又称叉积,是向量代…

Thunder团队Beta周贡献分规则

小组名称:Thunder 项目名称:i阅app 组长:王航 成员:李传康、翟宇豪、邹双黛、苗威、宋雨、胡佑蓉、杨梓瑞 分配规则 规则1:基础分,拿出总分的20%(8分)进行均分,剩下的80%…

SiftingAppender:将不同的线程记录到不同的日志文件中

Logback的一项新颖功能是SiftingAppender &#xff08; JavaDoc &#xff09;。 简而言之&#xff0c;它是一个代理附加器&#xff0c;它为给定运行时属性的每个唯一值创建一个子附加器。 通常&#xff0c;此属性来自MDC 。 这是基于上面链接的官方文档的示例&#xff1a; <…

gulp webpack整合

为什么需要前端工程化&#xff1f; 前端工程化的意义在于让前端这个行业由野蛮时代进化为正规军时代&#xff0c;近年来很多相关的工具和概念诞生。好奇心日报在进行前端工程化的过程中&#xff0c;主要的挑战在于解决如下问题&#xff1a;✦ 如何管理多个项目的前端代码&…

SpringBoot 入门第一章

一、前言 Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 本系列以快速入门为主&#xff0c;可当作工具小手册阅…