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.