模板方法模式–使用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{
  @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...

到目前为止,一切都很好。 但是,本文的主要目的不是创建有关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

你可能感兴趣的:(算法,java,设计模式,python,linux)