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

简介:

原文链接 作者:   Mohamed Sanaulla  译者: 李璟(jlee381344197@gmail.com)

模板方法模式是“四人帮”(译者注: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个核心任务封装到抽象类当中,如果任务可以被自定义,则将可自定义的任务推迟到子类中实现。

代码实现:


/** 
 * 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{

    @Override
    public 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{

    @Override
    public 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...


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

如果你仍然对Java 8中的Lambda表达式和默认方法感到疑惑,可以在深入研究之前,花一点时间看一看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...");

    }

}


现在我们的工作流系统带有一个可自定义的任务2,我们继续往下走,利用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表达式应用在模板方法模式中的例子。

目录
相关文章
|
1天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
4 0
Java接口中可以定义哪些方法?
|
3天前
|
分布式计算 Java API
Java 8新特性之Lambda表达式与Stream API
【4月更文挑战第16天】本文将介绍Java 8中的两个重要新特性:Lambda表达式和Stream API。Lambda表达式是Java 8中引入的一种新的编程语法,它允许我们将函数作为参数传递给其他方法,从而使代码更加简洁、易读。Stream API是Java 8中引入的一种新的数据处理方式,它允许我们以声明式的方式处理数据,从而使代码更加简洁、高效。本文将通过实例代码详细讲解这两个新特性的使用方法和优势。
|
7天前
|
Java Shell
Java 21颠覆传统:未命名类与实例Main方法的编码变革
Java 21颠覆传统:未命名类与实例Main方法的编码变革
10 0
|
7天前
|
Java
Java 14 强势登场:Switch 表达式的进化之路
Java 14 强势登场:Switch 表达式的进化之路
13 0
|
9天前
|
Java
Java中关于ConditionObject的signal()方法的分析
Java中关于ConditionObject的signal()方法的分析
21 4
|
9天前
|
安全 Java
append在Java中是哪个类下的方法
append在Java中是哪个类下的方法
21 9
|
8天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
1天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)
|
1天前
|
安全 Java 调度
Java并发编程:深入理解线程与锁
【4月更文挑战第18天】本文探讨了Java中的线程和锁机制,包括线程的创建(通过Thread类、Runnable接口或Callable/Future)及其生命周期。Java提供多种锁机制,如`synchronized`关键字、ReentrantLock和ReadWriteLock,以确保并发访问共享资源的安全。此外,文章还介绍了高级并发工具,如Semaphore(控制并发线程数)、CountDownLatch(线程间等待)和CyclicBarrier(同步多个线程)。掌握这些知识对于编写高效、正确的并发程序至关重要。
|
1天前
|
安全 Java 程序员
Java中的多线程并发编程实践
【4月更文挑战第18天】在现代软件开发中,为了提高程序性能和响应速度,经常需要利用多线程技术来实现并发执行。本文将深入探讨Java语言中的多线程机制,包括线程的创建、启动、同步以及线程池的使用等关键技术点。我们将通过具体代码实例,分析多线程编程的优势与挑战,并提出一系列优化策略来确保多线程环境下的程序稳定性和性能。