chain.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern"""
  4. class Handler:
  5. def successor(self, successor):
  6. self.successor = successor
  7. class ConcreteHandler1(Handler):
  8. def handle(self, request):
  9. if 0 < request <= 10:
  10. print('request {} handled in handler 1'.format(request))
  11. else:
  12. self.successor.handle(request)
  13. class ConcreteHandler2(Handler):
  14. def handle(self, request):
  15. if 10 < request <= 20:
  16. print('request {} handled in handler 2'.format(request))
  17. else:
  18. self.successor.handle(request)
  19. class ConcreteHandler3(Handler):
  20. def handle(self, request):
  21. if 20 < request <= 30:
  22. print('request {} handled in handler 3'.format(request))
  23. else:
  24. print('end of chain, no handler for {}'.format(request))
  25. class Client:
  26. def __init__(self):
  27. h1 = ConcreteHandler1()
  28. h2 = ConcreteHandler2()
  29. h3 = ConcreteHandler3()
  30. h1.successor(h2)
  31. h2.successor(h3)
  32. self.handlers = (h1, h2, h3)
  33. def delegate(self, requests):
  34. for request in requests:
  35. self.handlers[0].handle(request)
  36. if __name__ == "__main__":
  37. client = Client()
  38. requests = [2, 5, 14, 22, 18, 3, 35, 27, 20]
  39. client.delegate(requests)
  40. ### OUTPUT ###
  41. # request 2 handled in handler 1
  42. # request 5 handled in handler 1
  43. # request 14 handled in handler 2
  44. # request 22 handled in handler 3
  45. # request 18 handled in handler 2
  46. # request 3 handled in handler 1
  47. # end of chain, no handler for 35
  48. # request 27 handled in handler 3
  49. # request 20 handled in handler 2