責任の連鎖
責任の連鎖パターンは、クライアントからの指定された要求がそれに含まれるオブジェクトの連鎖を介して渡されるソフトウェアで疎結合を実現するために使用されます。オブジェクトのチェーンを構築するのに役立ちます。リクエストは一方の端から入り、あるオブジェクトから別のオブジェクトに移動します。
このパターンにより、オブジェクトは、どのオブジェクトが要求を処理するかを知らなくてもコマンドを送信できます。
責任の連鎖パターンを実装する方法は?
ここで、責任の連鎖パターンを実装する方法を見ていきます。
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つのハンドラーが必要です。必要なオブジェクトが各関数を実行すると、出力が出力されます。