为了以更简略的术语形容模板办法,思考这个场景:假如在一个工作流零碎中,为了实现工作,有 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 只能有一个形象或者说自定义的工作。
咱们能够利用带有默认办法的接口代替抽象类,所以咱们的新工作流零碎如下所示:
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 表达式利用在模板办法模式中的例子。’
最初
想要西厅的学习 Java 的私信回复 材料
支付一线大厂 Java 面试题总结 + 阿里巴巴泰山手册 + 各知识点学习思维导 + 一份 300 页 pdf 文档的 Java 外围知识点总结!
这些材料的内容都是面试时面试官必问的知识点,篇章包含了很多知识点,其中包含了有基础知识、Java 汇合、JVM、多线程并发、spring 原理、微服务、Netty 与 RPC、Kafka、日记、设计模式、Java 算法、数据库、Zookeeper、分布式缓存、数据结构等等。