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

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

代码实现:

  1. /**
  2. * Abstract Workflow system
  3. */
  4. abstract class WorkflowManager2{
  5. public void doTask1(){
  6. System.out.println("Doing Task1...");
  7. }
  8. public abstract void doTask2();
  9. public abstract void doTask3();
  10. public void doTask4(){
  11. System.out.println("Doing Task4...");
  12. }
  13. }
  14. /**
  15. * One of the extensions of the abstract workflow system
  16. */
  17. class WorkflowManager2Impl1 extends WorkflowManager2{
  18. @Override
  19. public void doTask2(){
  20. System.out.println("Doing Task2.1...");
  21. }
  22. @Override
  23. public void doTask3(){
  24. System.out.println("Doing Task3.1...");
  25. }
  26. }
  27. /**
  28. * Other extension of the abstract workflow system
  29. */
  30. class WorkflowManager2Impl2 extends WorkflowManager2{
  31. @Override
  32. public void doTask2(){
  33. System.out.println("Doing Task2.2...");
  34. }
  35. @Override
  36. public void doTask3(){
  37. System.out.println("Doing Task3.2...");
  38. }
  39. }

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

  1. public class TemplateMethodPattern {
  2. public static void main(String[] args) {
  3. initiateWorkFlow(new WorkflowManager2Impl1());
  4. initiateWorkFlow(new WorkflowManager2Impl2());
  5. }
  6. static void initiateWorkFlow(WorkflowManager2 workflowMgr){
  7. System.out.println("Starting the workflow ... the old way");
  8. workflowMgr.doTask1();
  9. workflowMgr.doTask2();
  10. workflowMgr.doTask3();
  11. workflowMgr.doTask4();
  12. }
  13. }

输出如下所示:

  1. Starting the workflow ... the old way
  2. Doing Task1...
  3. Doing Task2.1...
  4. Doing Task3.1...
  5. Doing Task4...
  6. Starting the workflow ... the old way
  7. Doing Task1...
  8. Doing Task2.2...
  9. Doing Task3.2...
  10. Doing Task4...

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

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

  1. interface WorkflowManager{
  2. public default void doTask1(){
  3. System.out.println("Doing Task1...");
  4. }
  5. public void doTask2();
  6. public default void doTask3(){
  7. System.out.println("Doing Task3...");
  8. }
  9. public default void doTask4(){
  10. System.out.println("Doing Task4...");
  11. }
  12. }

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

  1. public class TemplateMethodPatternLambda {
  2. public static void main(String[] args) {
  3. /**
  4. * Using lambda expression to create different
  5. * implementation of the abstract workflow
  6. */
  7. initiateWorkFlow(()->System.out.println("Doing Task2.1..."));
  8. initiateWorkFlow(()->System.out.println("Doing Task2.2..."));
  9. initiateWorkFlow(()->System.out.println("Doing Task2.3..."));
  10. }
  11. static void initiateWorkFlow(WorkflowManager workflowMgr){
  12. System.out.println("Starting the workflow ...");
  13. workflowMgr.doTask1();
  14. workflowMgr.doTask2();
  15. workflowMgr.doTask3();
  16. workflowMgr.doTask4();
  17. }
  18. }

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

最后

想要西厅的学习Java的私信回复 资料

领取一线大厂Java面试题总结+阿里巴巴泰山手册+各知识点学习思维导+一份300页pdf文档的Java核心知识点总结!

这些资料的内容都是面试时面试官必问的知识点,篇章包括了很多知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。

Java 8中Lambda表达式默认方法的模板方法模式,你够了解么?的更多相关文章

  1. java 8 中lambda表达式学习

    转自 http://blog.csdn.net/renfufei/article/details/24600507 http://www.jdon.com/idea/java/10-example-o ...

  2. Java中lambda表达式详解

    原文地址:http://blog.laofu.online/2018/04/20/java-lambda/ 为什么使用lambda 在java中我们很容易将一个变量赋值,比如int a =0;int ...

  3. Java 8——接口中个的默认方法和静态方法

    在Java SE 8之前,interface只是事物的抽象,用来定义统一的抽象事物和描述事物的抽象行为和属性. 但是在Java SE 8中,增加了可以在interface中增加默认实现的行为和事物的静 ...

  4. Java函数式编程:一、函数式接口,lambda表达式和方法引用

    Java函数式编程 什么是函数式编程 通过整合现有代码来产生新的功能,而不是从零开始编写所有内容,由此我们会得到更加可靠的代码,并获得更高的效率 我们可以这样理解:面向对象编程抽象数据,函数式编程抽象 ...

  5. Java 终于有 Lambda 表达式啦~Java 8 语言变化——Lambda 表达式和接口类更改【转载】

    原文地址 en cn 下载 Demo Java™ 8 包含一些重要的新的语言功能,为您提供了构建程序的更简单方式.Lambda 表达式 为内联代码块定义一种新语法,其灵活性与匿名内部类一样,但样板文件 ...

  6. Java学习笔记-Lambda表达式

    Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用简洁的代码来创建只有一个抽象方法的接口(这种接口被称为函数是接口)的实例 意义 自从Java 8开始,Java支持Lambda表达 ...

  7. 一文带你深入了解 Lambda 表达式和方法引用

    前言 尽管目前很多公司已经使用 Java8 作为项目开发语言,但是仍然有一部分开发者只是将其设置到 pom 文件中,并未真正开始使用.而项目中如果有8新特性的写法,例如λ表达式.也只是 Idea Al ...

  8. java8的新特性之lambda表达式和方法引用

    1.1. Lambda表达式 通过具体的实例去体会lambda表达式对于我们代码的简化,其实我们不去深究他的底层原理和背景,仅仅从用法上去理解,关注两方面: lambda表达式是Java8的一个语法糖 ...

  9. Spark中Lambda表达式的变量作用域

    通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...

随机推荐

  1. python基础算法

    一.简介 定义和特征 定义:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时 ...

  2. 牛客练习赛 66C公因子 题解

    原题 原题 思路 考场想复杂了,搞到自闭-- 实际上,因为差值不变,我们可以先差分,求\(\gcd\),便得到答案(考场时想多了,想到了负数.正数各种复杂的处理,但是不需要),最后处理一下即可 代码 ...

  3. Pull后产生多余的log(Merge branch 'master' of ...)

    第一步: git reset --hard 73d0d18425ae55195068d39b3304303ac43b521a 第二步: git push -f origin feature/PAC_1 ...

  4. vs code的使用(一) Format On Paste/Format On Save/ Format On Type

    很多经典的问题可以搜索出来,但是一些很小的问题网上却没有答案 (这是最令人发狂的,这么简单,网上居然连个相关的信息都没有给出) (就比如我想保存后自动格式化,但网上的大部分都是如何取消保存后自动格式化 ...

  5. .Net Core in Docker极简入门(上篇)

    目录 前言 开始 环境准备 Docker基础概念 Docker基础命令 Docker命令实践 构建Docker镜像 Dockerfile bulid & run 前言 Docker 是一个开源 ...

  6. AndroidStudio查找硬编码的String字符串

    在Menu的“Analyze”中,选择“Run Inspection By Name”,然后输入“Hardcoded strings”,执行后,可以找到所有没有加入strings.xml的字符串. 按 ...

  7. 服务器入侵应急响应排查(Linux篇)

    总体思路 确认问题与系统现象 → 取证清除与影响评估 → 系统加固 → 复盘整改 常见入侵 ① 挖矿: 表象:CPU增高.可疑定时任务.外联矿池IP. 告警:威胁情报(主要).Hids.蜜罐(挖矿扩散 ...

  8. PHPSTORM常用插件

    Translation 最好用的翻译插件 .env files support 可以在env函数使用是提示.env文件中所有的key值的自动完成功能 PHP composer.json support ...

  9. Day17_购物车

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 注:实验 ...

  10. 字典内置函数&方法

    字典内置函数&方法 Python字典包含了以下内置函数:高佣联盟 www.cgewang.com 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dic ...