|
3 | 3 |
|
4 | 4 | """http://www.testingperspective.com/wiki/doku.php/collaboration/chetan/designpatternsinpython/chain-of-responsibilitypattern""" |
5 | 5 |
|
6 | | - |
7 | 6 | classHandler: |
8 | | - |
9 | | -def__init__(self): |
10 | | -self._successor=None |
11 | | - |
12 | | -defsuccessor(self, successor): |
13 | | -self._successor=successor |
14 | | - |
15 | | -defhandle(self, request): |
| 7 | +def__init__(self,successor): |
| 8 | +self._successor=successor; |
| 9 | +defhandle(self,request): |
| 10 | +i=self._handle(request) |
| 11 | +ifnoti: |
| 12 | +self._successor.handle(request) |
| 13 | +def_handle(self, request): |
16 | 14 | raiseNotImplementedError('Must provide implementation in subclass.') |
17 | 15 |
|
18 | 16 |
|
19 | 17 | classConcreteHandler1(Handler): |
20 | 18 |
|
21 | | -defhandle(self, request): |
| 19 | +def_handle(self, request): |
22 | 20 | if0<request<=10: |
23 | 21 | print('request{} handled in handler 1'.format(request)) |
24 | | -elifself._successor: |
25 | | -self._successor.handle(request) |
26 | | - |
27 | | - |
| 22 | +returnTrue |
| 23 | + |
28 | 24 | classConcreteHandler2(Handler): |
29 | | - |
30 | | -defhandle(self, request): |
| 25 | +
|
| 26 | +def_handle(self, request): |
31 | 27 | if10<request<=20: |
32 | 28 | print('request{} handled in handler 2'.format(request)) |
33 | | -elifself._successor: |
34 | | -self._successor.handle(request) |
35 | | - |
36 | | - |
| 29 | +returnTrue |
| 30 | + |
37 | 31 | classConcreteHandler3(Handler): |
38 | | - |
39 | | -defhandle(self, request): |
| 32 | +
|
| 33 | +def_handle(self, request): |
40 | 34 | if20<request<=30: |
41 | 35 | print('request{} handled in handler 3'.format(request)) |
42 | | -elifself._successor: |
43 | | -self._successor.handle(request) |
44 | | - |
45 | | - |
| 36 | +returnTrue |
46 | 37 | classDefaultHandler(Handler): |
47 | | - |
48 | | -defhandle(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 | +returnTrue |
50 | 42 |
|
51 | 43 |
|
52 | 44 | classClient: |
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 | defdelegate(self, requests): |
67 | 48 | forrequestinrequests: |
68 | | -self.handlers[0].handle(request) |
| 49 | +self.handler.handle(request) |
69 | 50 |
|
70 | 51 |
|
71 | 52 | if__name__=="__main__": |
|
0 commit comments