java模板模式_使用Java8的Lambda实现模板模式

使用Java8的Lambda实现模板模式

模板模式是GoF 23种模式中的一种结构模式,模板模式能够在不改变算法的结构前提1下更改算法的某个具体步骤。

假设这样一个场景,有一个包含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 Expression和Default Methods.来优雅实现这个模板模式。我们用Lambda表达式抽象接口来替代抽象类,也就是WorkflowManager2,这个抽象接口只包含一个抽象方法:

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...");

}

}

注意到我们这里只有一个抽象类doTask2,其他都是default默认方法。

使用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();

}

}

方法initiateWorkFlow传入的是WorkflowManager类型,而WorkflowManager是一个doTask2需要实现的函数接口,因此,当我们调用initiateWorkFlow方法时,需要实现这个doTask2,这里实现分别是三个打印输出:()->System.out.println("Doing Task2.1...")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值