首先上代碼:
# 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可通過上下文實現數據共享與串聯(對鏈中各環節存有共性、異性的地方進行變化封裝,而后與主鏈進行銜接)。