Java 8のLambda式のデフォルトメソッドのテンプレートメソッドパターンを知っていますか?

テンプレートメソッドをより簡単に説明するために、次のシナリオを考えてみます。ワークフローシステムで、タスクを完了するために、特定の実行順序で実行する必要がある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式とデフォルトメソッドを使用してテンプレートメソッドパターンを実装する方法です。ラムダ式は、1つの抽象メソッドのみが宣言されている場合にのみインターフェイスで使用できると以前に述べました。このルールは、この記事の例で説明する必要があります。WorkflowManager2は、抽象タスクまたはカスタムタスクを1つだけ持つことができます。

抽象クラスをデフォルトのメソッドを持つインターフェースに置き換えることができるため、新しいワークフローシステムは次のようになります。

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式の例です。

やっと

West HallでJavaを学びたい場合は、第一線のメーカーのJavaインタビュー質問の概要+ Alibaba Taishanマニュアル+各ナレッジポイントの学習思考ガイド+ 300ページのPDFドキュメントでJavaコアナレッジポイントの概要を受け取ってください!

これらの資料の内容は、インタビュアーが面接中に尋ねる必要があるすべての知識ポイントです。この章には、基本的な知識、Javaコレクション、JVM、マルチスレッド同時実行性、Spring原則、マイクロサービス、NettyおよびRPC、Kafkaなどの多くの知識ポイントが含まれています、日記、デザインパターン、Javaアルゴリズム、データベース、Zookeeper、分散キャッシュ、データ構造など。 ファイル

おすすめ

転載: blog.csdn.net/weixin_46577306/article/details/107965028