責任連鎖パターンを実装する別の方法 (動的注入 + 逐次実行)

序文

責任連鎖モデルの基本的な考え方:

複数のオブジェクトにリクエストを処理する機会を与え、リクエストの送信者と受信者の結合関係を回避します。これらのオブジェクトをチェーンに接続し、オブジェクトが処理するまでこのチェーンに沿ってリクエストを渡します。

私の理解:

サブクラスは統一された抽象親クラスを継承します この抽象親クラス自体が現在の抽象親クラスのオブジェクトへの参照を持っています サブクラス内の抽象親クラスの属性の具体的な参照が変わると、具体的な実装方法はそれになりますはサブクラスによってオーバーライドされるメソッドになりました。

この記事は、仕事における責任の連鎖に対する著者の実際の対応に基づいており、次のコード シナリオを構築しました。

1. 責任連鎖の実装連鎖は固定されており、シミュレートされたデータはすべてのデータ フィルタリング プロセッサを通過する必要があります (注: 責任連鎖の実装連鎖は必ずしも固定されているわけではありません。ここでは固定された状況を示します)。

2. 特定のサブクラスの実装は構成可能である必要があります。つまり、サブクラスは @AutoWire を通じて自由に構成できます。サブクラスが構成されていない場合は、基本クラスを使用してフィルタリングが実行されます。

  

コード

このシナリオでは、組立ラインでの製品の検査について説明します。製品には、長さと幅という 2 つの属性があります。組立ラインには、長さチェッカーと幅チェッカーという 2 つの処理ノードもあります。すべてのチェッカーは基本クラス BaseCheckProcesor を継承します。

public interface Processor {
    boolean doProcess(Product request);
}



/**
 * @author: 代码丰
 * @Date: 2022/8/14 16:06
 * @Description: 默认处理器的实现类
 */
public class BaseCheckProcessor implements Processor {

    @Override
    public boolean doProcess(Product request) {
      return true;
    }

}



/**
 * 长度检验器的实现类
 */
@Component
public class LengthCheckProcessor extends BaseCheckProcessor {

    @Override
    public boolean doProcess(Product request) {
        Integer length = request.getLength();
        if (length < 100 && length > 50) {
            System.out.println("产品长度检验通过");
            return true;
        }

        // 产品长度未检验通过
        System.out.println("产品长度未检验通过");
        return false;
    }

}




/**
 * 宽度检验器的实现类
 */
@Component
public class WidthCheckProcessor extends BaseCheckProcessor {

    @Override
    public boolean doProcess(Product request) {
        Integer width = request.getWidth();
        if (width < 100 && width > 50) {
            System.out.println("产品宽度检验通过");
            return true;
        }
        // 产品宽度未检验通过
        System.out.println("产品宽度未检验通过");
        return false;
    }
}

次にプロセッサ チェーンです。プロセッサ チェーンにはすべての処理ノードがリスト形式で含まれており、doProcess メソッドが順番に実行されることがわかります。あるビジネス シナリオをシミュレートするには、すべてのプロセッサを通過する必要があります。

//处理器链
public class ProcessorChain {

    // 保存处理节点
    private List<Processor> processorList = new ArrayList<>();

    //模拟springBoot动态注入不同的处理器
    private List<Processor> getProcessList() {
        List<Processor> processorList = new ArrayList<>();
        processorList.add(new LengthCheckProcessor());
        processorList.add(new WidthCheckProcessor());
        return processorList;
    }


    //处理器的顺序调用,先校验长度,再校验宽度,同时返回Result类的结果
    public Result doProcess(Product product) {
        List<Processor> list = getProcessList();
        Result result = new Result(true);
        for (Processor item : list) {
            if (!item.doProcess(product)) {
                result.flag = false;
            }
        }
        return result;
    }
}


/**
 * @author: 代码丰
 * @Date: 2022/8/3 14:42
 * @Description: 返回的类
 */
@Data
@AllArgsConstructor
public class Result {
    Boolean flag;
}

最後のステップは、シミュレートされたデータを呼び出すことです。

public class Main {
    public static void main(String[] args) {
        int[][] arrays = {
   
   {60, 60}, {60, 40},{110,110}};
        for (int[] array : arrays) {
            ProcessorChain processorChain = new ProcessorChain();
            Product product = new Product(array[0], array[1]);
            Result checkResult = processorChain.doProcess(product);
            if(checkResult.flag) {
                System.out.println("产品最终检验合格");
            } else {
                System.out.println("产品最终检验不合格");
            }
            System.out.println();
        }
 
    }
}

要約する

責任連鎖モデルの核となる考え方

1. さまざまなプロセッサのサブクラスの実装を通じて、データはこれらのプロセッサを通過し、最終的にデータがフィルタリングされます。

2. サブクラスは、統合された抽象親クラスを継承します。この抽象親クラス自体は、現在の抽象親クラスのオブジェクトへの参照を持っています。サブクラス内の抽象親クラスの属性の特定の参照が変更されると、サブクラスでの特定の実装が変更されます。今回のメソッドはサブクラスによってオーバーライドされるメソッドになります。

参考文献

Java デザイン パターン責任チェーン パターン - SegmentFault Sifu

(メッセージ 38 件) Java 設計パターン 責任連鎖パターン (シンプルで理解しやすい)_Ronald Guang のブログ - CSDN ブログ_Java 責任連鎖パターン

おすすめ

転載: blog.csdn.net/qq_44716086/article/details/126332615