为了以更简略的术语形容模板办法,思考这个场景:假如在一个工作流零碎中,为了实现工作,有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 wayDoing Task1...Doing Task2.1...Doing Task3.1...Doing Task4...Starting the workflow ... the old wayDoing 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、分布式缓存、数据结构等等。