Catena di responsabilità
Il modello della catena di responsabilità viene utilizzato per ottenere un accoppiamento libero nel software in cui una specifica richiesta del client viene passata attraverso una catena di oggetti inclusi in esso. Aiuta a costruire una catena di oggetti. La richiesta entra da un'estremità e si sposta da un oggetto all'altro.
Questo modello consente a un oggetto di inviare un comando senza sapere quale oggetto gestirà la richiesta.
Come implementare il modello della catena di responsabilità?
Vedremo ora come implementare il modello della catena di responsabilità.
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)
Produzione
Il programma di cui sopra genera il seguente output:
Spiegazione
Il codice precedente crea un report per le attività mensili in cui invia i comandi attraverso ciascuna funzione. Sono necessari due gestori: per PDF e per testo. Stampa l'output una volta che l'oggetto richiesto esegue ciascuna funzione.