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.