Cadena de responsabilidad

El patrón de cadena de responsabilidad se usa para lograr un acoplamiento flexible en el software donde una solicitud específica del cliente se pasa a través de una cadena de objetos incluidos en él. Ayuda a construir una cadena de objetos. La solicitud entra por un extremo y pasa de un objeto a otro.

Este patrón permite que un objeto envíe un comando sin saber qué objeto manejará la solicitud.

¿Cómo implementar el patrón de cadena de responsabilidad?

Ahora veremos cómo implementar el patrón de cadena de responsabilidad.

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)

Salida

El programa anterior genera la siguiente salida:

Explicación

El código anterior crea un informe para las tareas mensuales donde envía comandos a través de cada función. Se necesitan dos controladores: para PDF y para texto. Imprime la salida una vez que el objeto requerido ejecuta cada función.