Цепочка ответственности

Шаблон цепочки ответственности используется для достижения слабой связи в программном обеспечении, когда указанный запрос от клиента передается через цепочку объектов, включенных в него. Это помогает в построении цепочки объектов. Запрос входит с одного конца и переходит от одного объекта к другому.

Этот шаблон позволяет объекту отправить команду, не зная, какой объект будет обрабатывать запрос.

Как реализовать схему цепочки ответственности?

Теперь мы увидим, как реализовать шаблон цепочки ответственности.

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 и для текста. Он печатает вывод после того, как требуемый объект выполняет каждую функцию.