|
@@ -3,69 +3,50 @@
|
|
|
|
|
|
"""http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern"""
|
|
|
|
|
|
-
|
|
|
class Handler:
|
|
|
-
|
|
|
- def __init__(self):
|
|
|
- self._successor = None
|
|
|
-
|
|
|
- def successor(self, successor):
|
|
|
- self._successor = successor
|
|
|
-
|
|
|
- def handle(self, request):
|
|
|
+ def __init__(self,successor):
|
|
|
+ self._successor = successor;
|
|
|
+ def handle(self,request):
|
|
|
+ i = self._handle(request)
|
|
|
+ if not i:
|
|
|
+ self._successor.handle(request)
|
|
|
+ def _handle(self, request):
|
|
|
raise NotImplementedError('Must provide implementation in subclass.')
|
|
|
|
|
|
|
|
|
class ConcreteHandler1(Handler):
|
|
|
|
|
|
- def handle(self, request):
|
|
|
+ def _handle(self, request):
|
|
|
if 0 < request <= 10:
|
|
|
print('request {} handled in handler 1'.format(request))
|
|
|
- elif self._successor:
|
|
|
- self._successor.handle(request)
|
|
|
-
|
|
|
-
|
|
|
+ return True
|
|
|
+
|
|
|
class ConcreteHandler2(Handler):
|
|
|
-
|
|
|
- def handle(self, request):
|
|
|
+
|
|
|
+ def _handle(self, request):
|
|
|
if 10 < request <= 20:
|
|
|
print('request {} handled in handler 2'.format(request))
|
|
|
- elif self._successor:
|
|
|
- self._successor.handle(request)
|
|
|
-
|
|
|
-
|
|
|
+ return True
|
|
|
+
|
|
|
class ConcreteHandler3(Handler):
|
|
|
-
|
|
|
- def handle(self, request):
|
|
|
+
|
|
|
+ def _handle(self, request):
|
|
|
if 20 < request <= 30:
|
|
|
print('request {} handled in handler 3'.format(request))
|
|
|
- elif self._successor:
|
|
|
- self._successor.handle(request)
|
|
|
-
|
|
|
-
|
|
|
+ return True
|
|
|
class DefaultHandler(Handler):
|
|
|
-
|
|
|
- def handle(self, request):
|
|
|
- print('end of chain, no handler for {}'.format(request))
|
|
|
+
|
|
|
+ def _handle(self, request):
|
|
|
+ print('end of chain, no handler for {}'.format(request))
|
|
|
+ return True
|
|
|
|
|
|
|
|
|
class Client:
|
|
|
-
|
|
|
def __init__(self):
|
|
|
- h1 = ConcreteHandler1()
|
|
|
- h2 = ConcreteHandler2()
|
|
|
- h3 = ConcreteHandler3()
|
|
|
- h4 = DefaultHandler()
|
|
|
-
|
|
|
- h1.successor(h2)
|
|
|
- h2.successor(h3)
|
|
|
- h3.successor(h4)
|
|
|
-
|
|
|
- self.handlers = (h1, h2, h3, h4,)
|
|
|
-
|
|
|
+ self.handler = ConcreteHandler1(ConcreteHandler3(ConcreteHandler2(DefaultHandler(None))))
|
|
|
def delegate(self, requests):
|
|
|
for request in requests:
|
|
|
- self.handlers[0].handle(request)
|
|
|
+ self.handler.handle(request)
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|