chain.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 __init__(self):
  6. self._successor = None
  7. def successor(self, successor):
  8. self._successor = successor
  9. def handle(self, request):
  10. raise NotImplementedError('Must provide implementation in subclass.')
  11. class ConcreteHandler1(Handler):
  12. def handle(self, request):
  13. if 0 < request <= 10:
  14. print('request {} handled in handler 1'.format(request))
  15. elif self._successor:
  16. self._successor.handle(request)
  17. class ConcreteHandler2(Handler):
  18. def handle(self, request):
  19. if 10 < request <= 20:
  20. print('request {} handled in handler 2'.format(request))
  21. elif self._successor:
  22. self._successor.handle(request)
  23. class ConcreteHandler3(Handler):
  24. def handle(self, request):
  25. if 20 < request <= 30:
  26. print('request {} handled in handler 3'.format(request))
  27. elif self._successor:
  28. self._successor.handle(request)
  29. class DefaultHandler(Handler):
  30. def handle(self, request):
  31. print('end of chain, no handler for {}'.format(request))
  32. class Client:
  33. def __init__(self):
  34. h1 = ConcreteHandler1()
  35. h2 = ConcreteHandler2()
  36. h3 = ConcreteHandler3()
  37. h4 = DefaultHandler()
  38. h1.successor(h2)
  39. h2.successor(h3)
  40. h3.successor(h4)
  41. self.handlers = (h1, h2, h3, h4,)
  42. def delegate(self, requests):
  43. for request in requests:
  44. self.handlers[0].handle(request)
  45. if __name__ == "__main__":
  46. client = Client()
  47. requests = [2, 5, 14, 22, 18, 3, 35, 27, 20]
  48. client.delegate(requests)
  49. ### OUTPUT ###
  50. # request 2 handled in handler 1
  51. # request 5 handled in handler 1
  52. # request 14 handled in handler 2
  53. # request 22 handled in handler 3
  54. # request 18 handled in handler 2
  55. # request 3 handled in handler 1
  56. # end of chain, no handler for 35
  57. # request 27 handled in handler 3
  58. # request 20 handled in handler 2