<一覧に戻る

責任連鎖パターン

責任連鎖パターン(Chain of Responsibility Pattern)は、オブジェクトの処理を単一のオブジェクトに集中させるのではなく、複数のオブジェクトにその処理の責任を分散させるためのデザインパターンです。このパターンを使用することで、リクエストを処理する責任を持つオブジェクトのチェーンを構築し、リクエストが適切なオブジェクトに到達するまで、チェーンをたどっていくことができます。

1. 責任連鎖パターンの構成

責任連鎖パターンは、以下の主要な要素で構成されます:

  • ハンドラー(Handler): リクエストを処理するインターフェースを持つオブジェクトです。具体的なハンドラーはこのインターフェースを実装し、リクエストを処理するか、次のハンドラーにリクエストを渡します。
  • 具体的なハンドラー(Concrete Handler): ハンドラーを実装したクラスで、特定のリクエストを処理する場合があります。
  • クライアント(Client): ハンドラーへのリクエストを発行するオブジェクトです。

2. サンプルコード

以下に、責任連鎖パターンのサンプルコードを示します。この例では、異なるレベルのサポートスタッフがリクエストを処理します。

class Handler:
    """リクエストを処理する基本インターフェース"""
    def set_next(self, handler):
        """次のハンドラーを設定する"""
        self.next_handler = handler
        return handler

    def handle(self, request):
        """リクエストを処理するメソッド"""
        if self.next_handler:
            return self.next_handler.handle(request)

class SupportHandler(Handler):
    """具体的なハンドラー - サポートスタッフ"""
    def __init__(self, level):
        self.level = level

    def handle(self, request):
        if request['level'] <= self.level:
            return f"Request handled by handler of level {self.level}"
        else:
            return super().handle(request)

コードの解説

  1. Handler クラス: このクラスは、リクエストを処理するための基本インターフェースを提供します。set_next メソッドを使って次のハンドラーを設定でき、handle メソッドでリクエストを処理します。

  2. SupportHandler クラス: Handler を継承した具体的なハンドラーです。各サポートスタッフはレベルを持ち、そのレベル以下のリクエストを処理できます。処理できない場合は、次のハンドラーにリクエストを渡します。

3. ハンドラーの設定とリクエストの処理

次に、ハンドラーを設定し、リクエストを処理するコードを示します。

# ハンドラーのインスタンスを作成
junior_support = SupportHandler(level=1)
mid_support = SupportHandler(level=2)
senior_support = SupportHandler(level=3)

# ハンドラーの連鎖を設定
junior_support.set_next(mid_support).set_next(senior_support)

# リクエストを処理
request = {'level': 2}
result = junior_support.handle(request)

print(result)  # "Request handled by handler of level 2"

コードの解説

  1. ハンドラーのインスタンス作成: それぞれのレベルのサポートスタッフ(ハンドラー)を作成します。
  2. ハンドラーの連鎖設定: set_next メソッドを使って、ハンドラー同士を連鎖させます。これにより、リクエストが適切なハンドラーに届くようになります。
  3. リクエストの処理: リクエストを作成し、最初のハンドラーである junior_support に処理させます。その結果を出力します。

このようにして、責任連鎖パターンを利用することで、リクエスト処理の柔軟性と拡張性を高めることができます。新しいハンドラーを追加することも容易ですし、リクエストの処理の流れを制御することも簡単です。

出力結果: