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