|
3 | 3 |
|
4 | 4 | """http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern""" |
5 | 5 |
|
6 | | - |
7 | 6 | class Handler: |
8 | | - |
9 | | - def __init__(self): |
10 | | - self._successor = None |
11 | | - |
12 | | - def successor(self, successor): |
13 | | - self._successor = successor |
14 | | - |
15 | | - def handle(self, request): |
| 7 | + def __init__(self,successor): |
| 8 | + self._successor = successor; |
| 9 | + def handle(self,request): |
| 10 | + i = self._handle(request) |
| 11 | + if not i: |
| 12 | + self._successor.handle(request) |
| 13 | + def _handle(self, request): |
16 | 14 | raise NotImplementedError('Must provide implementation in subclass.') |
17 | 15 |
|
18 | 16 |
|
19 | 17 | class ConcreteHandler1(Handler): |
20 | 18 |
|
21 | | - def handle(self, request): |
| 19 | + def _handle(self, request): |
22 | 20 | if 0 < request <= 10: |
23 | 21 | print('request {} handled in handler 1'.format(request)) |
24 | | - elif self._successor: |
25 | | - self._successor.handle(request) |
26 | | - |
27 | | - |
| 22 | + return True |
| 23 | + |
28 | 24 | class ConcreteHandler2(Handler): |
29 | | - |
30 | | - def handle(self, request): |
| 25 | + |
| 26 | + def _handle(self, request): |
31 | 27 | if 10 < request <= 20: |
32 | 28 | print('request {} handled in handler 2'.format(request)) |
33 | | - elif self._successor: |
34 | | - self._successor.handle(request) |
35 | | - |
36 | | - |
| 29 | + return True |
| 30 | + |
37 | 31 | class ConcreteHandler3(Handler): |
38 | | - |
39 | | - def handle(self, request): |
| 32 | + |
| 33 | + def _handle(self, request): |
40 | 34 | if 20 < request <= 30: |
41 | 35 | print('request {} handled in handler 3'.format(request)) |
42 | | - elif self._successor: |
43 | | - self._successor.handle(request) |
44 | | - |
45 | | - |
| 36 | + return True |
46 | 37 | class DefaultHandler(Handler): |
47 | | - |
48 | | - def handle(self, request): |
49 | | - print('end of chain, no handler for {}'.format(request)) |
| 38 | + |
| 39 | + def _handle(self, request): |
| 40 | + print('end of chain, no handler for {}'.format(request)) |
| 41 | + return True |
50 | 42 |
|
51 | 43 |
|
52 | 44 | class Client: |
53 | | - |
54 | 45 | def __init__(self): |
55 | | - h1 = ConcreteHandler1() |
56 | | - h2 = ConcreteHandler2() |
57 | | - h3 = ConcreteHandler3() |
58 | | - h4 = DefaultHandler() |
59 | | - |
60 | | - h1.successor(h2) |
61 | | - h2.successor(h3) |
62 | | - h3.successor(h4) |
63 | | - |
64 | | - self.handlers = (h1, h2, h3, h4,) |
65 | | - |
| 46 | + self.handler = ConcreteHandler1(ConcreteHandler3(ConcreteHandler2(DefaultHandler(None)))) |
66 | 47 | def delegate(self, requests): |
67 | 48 | for request in requests: |
68 | | - self.handlers[0].handle(request) |
| 49 | + self.handler.handle(request) |
69 | 50 |
|
70 | 51 |
|
71 | 52 | if __name__ == "__main__": |
|
0 commit comments