Python 设计模式 - 责任链模式

  • 简述

    责任链模式用于在软件中实现松散耦合,其中来自客户端的指定请求通过其中包含的对象链传递。它有助于构建对象链。请求从一端进入并从一个对象移动到另一个对象。
    这种模式允许对象在不知道哪个对象将处理请求的情况下发送命令。
  • 如何实现责任链模式?

    我们现在将看到如何实现责任链模式。
    
    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 和文本。一旦所需的对象执行每个函数,它就会打印输出。