Преглед изворни кода

added abstract handle method in Handler class; added next handler check in concrete handlers.

Milos Cubrilo пре 11 година
родитељ
комит
3d22ac0b9e
1 измењених фајлова са 19 додато и 7 уклоњено
  1. 19 7
      chain.py

+ 19 - 7
chain.py

@@ -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: