chain.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. # http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern
  2. class Handler:
  3. def __init__(self):
  4. self.successor = None
  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 {0} handeled 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 {0} handeled 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 {0} handeled 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)