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