首先上代码:
# coding=utf8
class Handler:
"""
抽象接口
"""
def __init__(self):
pass
def successor(self, successor):
self.successor = successor
def handle(self, request):
pass
class ConcreteHandler1(Handler):
"""
接口实现方法handler1
"""
def handle(self, request):
if 0 < request <= 10:
print("in handler1")
else:
self.successor.handle(request)
class ConcreteHandler2(Handler):
"""
接口实现方法handler2
"""
def handle(self, request):
if 10 < request <= 20:
print("in handler2")
else:
self.successor.handle(request)
class ConcreteHandler3(Handler):
"""
接口实现方法handler3
"""
def handle(self, request):
if 20 < request <= 30:
print("in handler3")
else:
self.successor.handle(request)
class FinalHandler(Handler):
"""
最终处理handler
"""
def handle(self, request):
print('end of chain, no handler for {}'.format(request))
class Client(object):
def __init__(self):
h1 = ConcreteHandler1()
h2 = ConcreteHandler2()
h3 = ConcreteHandler3()
final = FinalHandler()
# 这里再实例化完成之后进行任务的传递过程设置
h1.successor(h2)
h2.successor(h3)
h3.successor(final)
requests = [2, 5, 14, 22, 18, 3, 35, 27, 20]
for request in requests:
h1.handle(request)
if __name__ == "__main__":
client = Client()
代码逻辑还是很简单的,一个抽象接口,剩下四个具体的实现类,最重要的点就在接口定义的时候,我们在接口中定义了一个属性,successor,这个属性时什么意思?英语意思就是继承者,我们这边的意思就是接下来要把这个给谁的下一个目标。
跳到client类中,有几个实例化的对象,然后我们再设置任务传递过程,就是将我们一层一层要执行的过程添加到successor中,最后我们在添加一个最终处理类,相当于try except finally的执行过程。
应用场景:
1.框架中的应用:
struts2的Action的职责层面而言,需要在Action这个层面上完成的职责很多,因此通过Interceptor将职责进行合理的分类和排序,将他们组织成有序的执行队列。struts2中使用了一种类似责任链的设计模式对这些不同的职责进行分类并串联起来,从而使得Action层具备了丰富的层次结构。每一层就相当于现在代码中的一个具体类实现。有兴趣的童鞋可以看看java的三大框架,很经典,很实用。
2.业务场景应用:
类似Work flow中面向流程性的处理方案也是一个很好的选择,关于WF这里不在赘述。在面向这种流程性事务处理过程中,简单的说就是你有很多业务,这些业务都有各自的业务处理流程,且这些流程有很多相同的事务处理逻辑,则大可通过将每个主要的业务流程作为一个处理Step、一个链节点,通过配置链节点的先后顺序,来完成一系列业务逻辑的执行过程。而各个节点或事务step可通过上下文实现数据共享与串联(对链中各环节存有共性、异性的地方进行变化封装,而后与主链进行衔接)。