设计模式之责任链

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84

# encoding: utf-8
"""
责任链模式
使多个对象都以机会处理请求, 从而避免请求的发送者和接受者之间的耦合关系
将这个对象连成一条链, 沿着这条链传递请求, 直到有一个对象处理它为止
- 可以随意增加或修改处理一个请求的链式结构
"""

from abc import ABCMeta, abstractmethod


class Handler(object):
"""
定义一个处理请求的接口
"""
__metaclass__ = ABCMeta

def __init__(self):
self.__successor = None

@property
def successor(self):
return self.__successor

@successor.setter
def successor(self, value):
self.__successor = value

@abstractmethod
def handle_request(self, request):
pass


class ConcreteHandlerA(Handler):
"""
具体处理类, 处理它所负责的请求
如果可以处理该请求, 处理之, 否则转给后继者
"""

def handle_request(self, request):
if 0 <= request < 10:
print "%s process %s" % (self.__class__.__name__, request)
else:
self.successor.handle_request(request)


class ConcreteHandlerB(Handler):
"""
具体处理类, 处理它所负责的请求
如果可以处理该请求, 处理之, 否则转给后继者
"""

def handle_request(self, request):
if 10 <= request < 20:
print "%s process %s" % (self.__class__.__name__, request)
else:
self.successor.handle_request(request)


class ConcreteHandlerC(Handler):
"""
具体处理类, 处理它所负责的请求
如果可以处理该请求, 处理之, 否则转给后继者
"""

def handle_request(self, request):
if 20 <= request < 30:
print "%s process %s" % (self.__class__.__name__, request)
else:
self.successor.handle_request(request)


if __name__ == '__main__':
h1 = ConcreteHandlerA()
h2 = ConcreteHandlerB()
h3 = ConcreteHandlerC()

h1.successor = h2
h2.successor = h3

for req in [2, 14, 22]:
print req
h1.handle_request(req)