开发者社区> 青衫无名> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

采用Java 8中Lambda表达式和默认方法的模板方法模式

简介:
+关注继续查看

模板方法模式是“四人帮”(译者注:Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides)所著《Design Patterns book》一书中所描述的23种设计模式其中的一种,该模式旨在:

“Define the skeleton of an algorithm in an operation, deferring some steps to subclasses.

TemplateMethod lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure”。

即模板方法定义一个算法的架构,并将某些步骤推迟到子类中实现。模板方法允许子类在不改变算法架构的情况下,重新定义算法中某些步骤。

为了以更简单的术语描述模板方法,考虑这个场景:假设在一个工作流系统中,为了完成任务,有4个任务必须以给定的执行顺序执行。在这4个任务中,不同工作流系统的实现可以根据自身情况自定义任务的执行内容。

模板方法可以应用在上述场景中:将工作流系统的4个核心任务封装到抽象类当中,如果任务可以被自定义,则将可自定义的任务推迟到子类中实现。

代码实现:

01 /** 
02  * Abstract Workflow system 
03  */
04 abstract class WorkflowManager2{
05  
06     public void doTask1(){
07  
08         System.out.println("Doing Task1...");
09  
10     }
11  
12     public abstract void doTask2();
13  
14     public abstract void doTask3();
15  
16     public void doTask4(){
17  
18         System.out.println("Doing Task4...");
19  
20     }
21  
22 }
23  
24 /** 
25  * One of the extensions of the abstract workflow system 
26  */
27 class WorkflowManager2Impl1 extends WorkflowManager2{
28  
29     @Override
30     public void doTask2(){
31  
32         System.out.println("Doing Task2.1...");
33  
34     }
35  
36     @Override
37     public void doTask3(){
38  
39         System.out.println("Doing Task3.1...");
40  
41     }
42  
43 }
44  
45 /** 
46  * Other extension of the abstract workflow system 
47  */
48 class WorkflowManager2Impl2 extends WorkflowManager2{
49  
50     @Override
51     public void doTask2(){
52  
53         System.out.println("Doing Task2.2...");
54  
55     }
56  
57     @Override
58     public void doTask3(){
59  
60         System.out.println("Doing Task3.2...");
61  
62     }
63  
64 }

我们来看看工作流系统如何使用:

01 public class TemplateMethodPattern {
02  
03     public static void main(String[] args) {
04  
05         initiateWorkFlow(new WorkflowManager2Impl1());
06  
07         initiateWorkFlow(new WorkflowManager2Impl2());
08  
09     }
10  
11     static void initiateWorkFlow(WorkflowManager2 workflowMgr){
12  
13         System.out.println("Starting the workflow ... the old way");
14  
15         workflowMgr.doTask1();
16  
17         workflowMgr.doTask2();
18  
19         workflowMgr.doTask3();
20  
21         workflowMgr.doTask4();
22  
23     }
24  
25 }

输出如下所示:

01 Starting the workflow ... the old way
02  
03 Doing Task1...
04  
05 Doing Task2.1...
06  
07 Doing Task3.1...
08  
09 Doing Task4...
10  
11 Starting the workflow ... the old way
12  
13 Doing Task1...
14  
15 Doing Task2.2...
16  
17 Doing Task3.2...
18  
19 Doing Task4...

目前为止一切顺利。但是本篇博客的主要关注点不是模板方法模式,而是如何利用Java 8的Lambda表达式和默认方法实现模板方法模式。我之前已经说过,接口只有在只声明了一个抽象方法的前提下,才可以使用Lambda表达式。这个规则在本篇的例子中应这样解释:WorkflowManager2只能有一个抽象或者说自定义的任务。

如果你仍然对Java 8中的Lambda表达式和默认方法感到疑惑,可以在深入研究之前,花一点时间看一看Lambda表达式默认方法这两篇文章。

我们可以利用带有默认方法的接口替代抽象类,所以我们的新工作流系统如下所示:

01 interface WorkflowManager{
02  
03     public default void doTask1(){
04  
05         System.out.println("Doing Task1...");
06  
07     }
08  
09     public void doTask2();
10  
11     public default void doTask3(){
12  
13         System.out.println("Doing Task3...");
14  
15     }
16  
17     public default void doTask4(){
18  
19         System.out.println("Doing Task4...");
20  
21     }
22  
23 }

现在我们的工作流系统带有一个可自定义的任务2,我们继续往下走,利用Lambda表达式处理初始化工作:

01 public class TemplateMethodPatternLambda {
02  
03     public static void main(String[] args) {
04  
05        /**     
06         * Using lambda expression to create different      
07         * implementation of the abstract workflow 
08         */
09         initiateWorkFlow(()->System.out.println("Doing Task2.1..."));
10  
11         initiateWorkFlow(()->System.out.println("Doing Task2.2..."));
12  
13         initiateWorkFlow(()->System.out.println("Doing Task2.3..."));
14  
15     }
16  
17     static void initiateWorkFlow(WorkflowManager workflowMgr){
18  
19         System.out.println("Starting the workflow ...");
20  
21         workflowMgr.doTask1();
22  
23         workflowMgr.doTask2();
24  
25         workflowMgr.doTask3();
26  
27         workflowMgr.doTask4();
28  
29     }
30  
31 }

这就是一个Lambda表达式应用在模板方法模式中的例子。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java 8 新特性:Lambda 表达式
Java 8 新特性:Lambda 表达式
33 0
Java8新特性-Lambda表达式
Lambda表达式简化了我们代码开发,使得我们开发的代码看起来更加的简洁,所以我们需要学习这种更加规范、更加简洁的代码格式。
18 0
Java8.0新特性之Lambda表达式
  好程序员Java教程分享Java8.0新特性之Lambda表达式:Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。本篇文章,主要给大家介绍的是lambda表达式。 Lambda表达式 Lambda表达式(也称为闭包)是Java 8中最大和最令人期待的语言改变。
798 0
好程序员分享java8新特性之Lambda表达式
好程序员分享java8新特性之Lambda表达式 ⼀、Lambda表达式简介 什么是Lambda? Lambda表达式是Java 8推出的⼀个新特性。从本质上讲,Lambda表达式是⼀个匿名函数。 为什么要使⽤Lambda? 使⽤Lambda表达式可以对⼀个接⼝进⾏⾮常简洁的实现。
1406 0
Java8新特性之一:Lambda表达式
Java8新特性之一:Lambda表达式Java8是自java5之后最重大的一次更新,它给JAVA语言带来了很多新的特性(包括编译器、类库、工具类、JVM等),其中最重要的升级是它给我们带来了Lambda表达式和Stream API。
1094 0
java8新特性(二)_lambda表达式
最近一直找java8相关新特性的文章,发现都太没有一个连贯性,毕竟大家写博客肯定都有自己的侧重点,这里找到一本书,专门介绍java8新特性的,感觉大家可以看看《写给大忙人看的JavaSE8》.这里我会结合书中的知识以及网上的知识,对于java8 的新特性进行总结,当然我自己写的也会有自己的侧重点。
1391 0
Java 8 新特性(一)lambda表达式
Java 9 好像也快出了,不过我连Java 8的新特性都还没认真研究过,所以这几篇文章就是来介绍Java 8的新特性的。首先,第一个重要的特性就是传说中的lambda表达式了,虽然初学可能觉得这东西很难理解,但是一旦学会了,你就会发现离不开它了。
645 0
Java 8 新特性之 Lambda表达式
Lambda的出现就是为了增强Java面向过程编程的深度和灵活性。今天就来分享一下在Java中经常使用到的几个示例,通过对比分析,效果应该会更好。 – 1、实现Runnable线程案例 其存在的意义就是用Lambda来代替匿名类,如下: // before java 8...
972 0
五分钟带你玩转多线程(一)java多线程基础知识简介
线程概念 进程:是一个执行中的程序,如打开网易云音乐,网易云音乐就是一个进程 线程:是进程的组成,一个进程包含多个线程,是jvm最小调度单元。如网易云音乐听歌是一个线程,评价是一个线程。
53 0
+关注
3593
文章
840
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载