責任連鎖パターン(Chain of Responsibility Pattern)は、オブジェクトの処理を単一のオブジェクトに集中させるのではなく、複数のオブジェクトにその処理の責任を分散させるためのデザインパターンです。このパターンを使用することで、リクエストを処理する責任を持つオブジェクトのチェーンを構築し、リクエストが適切なオブジェクトに到達するまで、チェーンをたどっていくことができます。
責任連鎖パターンは、以下の主要な要素で構成されます:
以下に、責任連鎖パターンのサンプルコードを示します。この例では、異なるレベルのサポートスタッフがリクエストを処理します。
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)
Handler クラス: このクラスは、リクエストを処理するための基本インターフェースを提供します。set_next
メソッドを使って次のハンドラーを設定でき、handle
メソッドでリクエストを処理します。
SupportHandler クラス: Handler
を継承した具体的なハンドラーです。各サポートスタッフはレベルを持ち、そのレベル以下のリクエストを処理できます。処理できない場合は、次のハンドラーにリクエストを渡します。
次に、ハンドラーを設定し、リクエストを処理するコードを示します。
# ハンドラーのインスタンスを作成
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"
set_next
メソッドを使って、ハンドラー同士を連鎖させます。これにより、リクエストが適切なハンドラーに届くようになります。junior_support
に処理させます。その結果を出力します。このようにして、責任連鎖パターンを利用することで、リクエスト処理の柔軟性と拡張性を高めることができます。新しいハンドラーを追加することも容易ですし、リクエストの処理の流れを制御することも簡単です。