チェーンオブレスポンシビリティパターン: 責任の連鎖を通じた効果的な処理の実現


このパターンを適用するシナリオはいくつかあります。以下にいくつかの例を示します。

  1. リクエストの処理の優先順位を設定する必要がある場合: チェーンオブレスポンシビリティパターンを使用すると、リクエストを処理するオブジェクトの順序を柔軟に設定することができます。各オブジェクトはリクエストを処理する能力を持っており、リクエストの性質に基づいて最適なオブジェクトが選択されます。例えば、セキュリティチェック、データのバリデーション、データベースの操作などの処理を優先順位に基づいて連鎖させることができます。

  2. 複数のオブジェクトによる処理の分割と統合が必要な場合: チェーンオブレスポンシビリティパターンは、処理を複数のオブジェクトに分割し、それぞれが異なる責任を持つようにすることで、システムの柔軟性を高めることができます。各オブジェクトは自身の責任範囲内で処理を行い、必要に応じて次のオブジェクトに処理を委譲します。例えば、パイプライン処理、フィルタリング、変換などの場合に有用です。

  3. 複数のオブジェクトによる処理の並列化が必要な場合: チェーンオブレスポンシビリティパターンは、処理を並列化する場合にも有効です。各オブジェクトは独立して処理を実行し、結果を統合することで高速化や負荷分散を実現できます。例えば、並列処理のためのスレッドプールやマルチプロセス環境での処理分散などに利用できます。

これらのシナリオにおいて、チェーンオブレスポンシビリティパターンは柔軟性と拡張性を提供し、処理の責任を適切に分散することができます。以下に、Java言語でのコード例を示します。

// ハンドラの抽象public abstract class Handler {
    private Handler nextHandler;
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
    public void handleRequest(Request request) {
        if (canHandle(request)) {
            processRequest(request);
        } else if (nextHandler != null) {
            nextHandler.handleRequest(request);
        }
    }
    protected abstract boolean canHandle(Request request);
    protected abstract void processRequest(Request request);
}
// 具体的なハンドラ
public class ConcreteHandlerA extends Handler {
    @Override
    protected boolean canHandle(Request request) {
        // リクエストの条件に基づいて処理可否を判定
        // 例えば、特定の種類のリクエストに対して処理を行う場合など
        return request.getType().equals("TypeA");
    }
    @Override
    protected void processRequest(Request request) {
        // リクエストの処理を実行
        // 例えば、TypeAのリクエストに対する具体的な処理など
    }
}
public class ConcreteHandlerB extends Handler {
    @Override
    protected boolean canHandle(Request request) {
        // リクエストの条件に基づいて処理可否を判定
        // 例えば、特定の状態のリクエストに対して処理を行う場合など
        return request.getState().equals("StateB");
    }
    @Override
    protected void processRequest(Request request) {
        // リクエストの処理を実行
        // 例えば、StateBのリクエストに対する具体的な処理など
    }
}
// リクエストクラス
public class Request {
    private String type;
    private String state;
    public Request(String type, String state) {
        this.type = type;
        this.state = state;
    }
    public String getType() {
        return type;
    }
    public String getState() {
        return state;
    }
}
// 使用例
public class Main {
    public static void main(String[] args) {
        // ハンドラのインスタンス化
        Handler handlerA = new ConcreteHandlerA();
        Handler handlerB = new ConcreteHandlerB();
        // ハンドラの連鎖を設定
        handlerA.setNextHandler(handlerB);
        // リクエストの作成
        Request request = new Request("TypeA", "StateB");
        // リクエストの処理
        handlerA.handleRequest(request);
    }
}

この例では、Handler クラスが抽象ハンドラとして定義され、ConcreteHandlerAConcreteHandlerB が具体的なハンドラとして定義されています。各ハンドラはリクエストが自身で処理可能かどうかを判定し、処理可能であれば実際の処理を実行します。処理不可能であれば次のハンドラにリクエストを委譲します。Main クラスではハンドラの連鎖を構築し、リクエストを処理する際に最初のハンドラにリクエストを渡します。

以上が、チェーンオブレスポンシビリティパターンの基本的な説明とコード例です。このパターンは、処理の柔軟性と拡張性を向上させるために使用されます。