|
@@ -5,18 +5,23 @@
|
|
|
|
|
|
|
|
|
class Handler:
|
|
|
+
|
|
|
+ def __init__(self):
|
|
|
+ self._successor = None
|
|
|
|
|
|
def successor(self, successor):
|
|
|
- self.successor = successor
|
|
|
+ self._successor = successor
|
|
|
|
|
|
+ def handler(self, request):
|
|
|
+ raise NotImplementedError('Must provide implementation in subclass.')
|
|
|
|
|
|
class ConcreteHandler1(Handler):
|
|
|
|
|
|
def handle(self, request):
|
|
|
if 0 < request <= 10:
|
|
|
print('request {} handled in handler 1'.format(request))
|
|
|
- else:
|
|
|
- self.successor.handle(request)
|
|
|
+ elif self._successor:
|
|
|
+ self._successor.handle(request)
|
|
|
|
|
|
|
|
|
class ConcreteHandler2(Handler):
|
|
@@ -24,8 +29,8 @@ class ConcreteHandler2(Handler):
|
|
|
def handle(self, request):
|
|
|
if 10 < request <= 20:
|
|
|
print('request {} handled in handler 2'.format(request))
|
|
|
- else:
|
|
|
- self.successor.handle(request)
|
|
|
+ elif self._successor:
|
|
|
+ self._successor.handle(request)
|
|
|
|
|
|
|
|
|
class ConcreteHandler3(Handler):
|
|
@@ -33,7 +38,12 @@ class ConcreteHandler3(Handler):
|
|
|
def handle(self, request):
|
|
|
if 20 < request <= 30:
|
|
|
print('request {} handled in handler 3'.format(request))
|
|
|
- else:
|
|
|
+ elif self._successor:
|
|
|
+ self._successor.handle(request)
|
|
|
+
|
|
|
+class DefaultHandler(Handler):
|
|
|
+
|
|
|
+ def handle(self, request):
|
|
|
print('end of chain, no handler for {}'.format(request))
|
|
|
|
|
|
|
|
@@ -43,11 +53,13 @@ class Client:
|
|
|
h1 = ConcreteHandler1()
|
|
|
h2 = ConcreteHandler2()
|
|
|
h3 = ConcreteHandler3()
|
|
|
+ h4 = DefaultHandler()
|
|
|
|
|
|
h1.successor(h2)
|
|
|
h2.successor(h3)
|
|
|
+ h3.successor(h4)
|
|
|
|
|
|
- self.handlers = (h1, h2, h3)
|
|
|
+ self.handlers = (h1, h2, h3, h4,)
|
|
|
|
|
|
def delegate(self, requests):
|
|
|
for request in requests:
|