Python-design-patterns-chain-of-responsibility

提供:Dev Guides
移動先:案内検索

責任の連鎖

責任の連鎖パターンは、クライアントからの指定された要求がそれに含まれるオブジェクトのチェーンを通過するソフトウェアで疎結合を実現するために使用されます。 オブジェクトのチェーンを構築するのに役立ちます。 要求は一方の端から入り、あるオブジェクトから別のオブジェクトに移動します。

このパターンにより、オブジェクトはどのオブジェクトがリクエストを処理するかを知らなくてもコマンドを送信できます。

責任の連鎖パターンを実装する方法は?

次に、責任の連鎖パターンを実装する方法を見ていきます。

class ReportFormat(object):
   PDF = 0
   TEXT = 1
class Report(object):
   def __init__(self, format_):
      self.title = 'Monthly report'
      self.text = ['Things are going', 'really, really well.']
      self.format_ = format_

class Handler(object):
   def __init__(self):
      self.nextHandler = None

   def handle(self, request):
      self.nextHandler.handle(request)

class PDFHandler(Handler):

   def handle(self, request):
      if request.format_ == ReportFormat.PDF:
         self.output_report(request.title, request.text)
      else:
         super(PDFHandler, self).handle(request)

   def output_report(self, title, text):
      print '<html>'
      print ' <head>'
      print ' <title>%s</title>' % title
      print ' </head>'
      print ' <body>'
      for line in text:
         print ' <p>%s' % line
      print ' </body>'
      print '</html>'

class TextHandler(Handler):

   def handle(self, request):
      if request.format_ == ReportFormat.TEXT:
         self.output_report(request.title, request.text)
      else:
         super(TextHandler, self).handle(request)

   def output_report(self, title, text):
      print 5*'*' + title + 5*'*'
      for line in text:
         print line

class ErrorHandler(Handler):
   def handle(self, request):
      print "Invalid request"

if __name__ == '__main__':
   report = Report(ReportFormat.TEXT)
   pdf_handler = PDFHandler()
   text_handler = TextHandler()

   pdf_handler.nextHandler = text_handler
   text_handler.nextHandler = ErrorHandler()
    pdf_handler.handle(report)

出力

上記のプログラムは、次の出力を生成します-

デザインチェーンパターン

説明

上記のコードは、各機能を介してコマンドを送信する月次タスクのレポートを作成します。 PDF用とテキスト用の2つのハンドラーが必要です。 必要なオブジェクトが各機能を実行すると、出力を印刷します。