chain.py 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern
  2. class Handler:
  3. def successor(self, successor):
  4. self.successor = successor
  5. class ConcreteHandler1(Handler):
  6. def handle(self, request):
  7. if 0 < request <= 10:
  8. print("in handler1")
  9. else:
  10. self.successor.handle(request)
  11. class ConcreteHandler2(Handler):
  12. def handle(self, request):
  13. if 10 < request <= 20:
  14. print("in handler2")
  15. else:
  16. self.successor.handle(request)
  17. class ConcreteHandler3(Handler):
  18. def handle(self, request):
  19. if 20 < request <= 30:
  20. print("in handler3")
  21. else:
  22. print('end of chain, no handler for {}'.format(request))
  23. class Client:
  24. def __init__(self):
  25. h1 = ConcreteHandler1()
  26. h2 = ConcreteHandler2()
  27. h3 = ConcreteHandler3()
  28. h1.successor(h2)
  29. h2.successor(h3)
  30. self.handlers = (h1,h2,h3)
  31. def delegate(self, requests):
  32. for request in requests:
  33. self.handlers[0].handle(request)
  34. if __name__ == "__main__":
  35. client = Client()
  36. requests = [2, 5, 14, 22, 18, 3, 35, 27, 20]
  37. client.delegate(requests)