Шаблон цепочки ответственности используется для достижения слабой связи в программном обеспечении, когда указанный запрос от клиента передается через цепочку включенных в него объектов. Это помогает в построении цепочки объектов. Запрос поступает с одного конца и перемещается с одного объекта на другой.
Этот шаблон позволяет объекту отправлять команду, не зная, какой объект будет обрабатывать запрос.
Как реализовать схему цепочки ответственности?
Теперь посмотрим, как реализовать схему цепочки ответственности.
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 и для текста. Он печатает выходные данные, когда требуемый объект выполняет каждую функцию.