對於每一種設計模式,若是不理解它的原理和結構,是寫不出例子來的。因此弄明白很重要。html
等過完這段渾渾噩噩的日子,我要找個遍地開花的地方開懷大笑一場python
簡書上一網友就把這個定義就說的挺清楚,下面有參考鏈接。明明簡簡單單的事情,百科上非要寫的文縐縐的,很拗口,又晦澀設計模式
責任鏈模式就是這種「推卸」責任的模式,你的問題在我這裏能解決我就解決,不行就把你推給另外一個對象。至於到底誰解決了這個問題了呢?我管呢!mybatis
1) 抽象處理者角色(Handler):它定義了一個處理請求的接口。固然對於鏈子的不一樣實現,也能夠在這個角色中實現後繼鏈。
2) 具體處理者角色(Concrete Handler):實現抽象角色中定義的接口,並處理它所負責的請求。若是不能處理則訪問它的後繼者。框架
1.紅樓夢中的擊鼓傳花jsp
2.JS中的事件冒泡性能
3.JAVA WEB中的Apache Tomcat對Encoding的處理.net
4.Struts2d 的攔截器設計
5.jsp servlet的filter,servlet中的filter
6.dubbo中的filter
7. mybatis中的plugin 這3個框架在實現責任鏈方式不盡相同。調試
後面這些我也不太瞭解,
一、有多個對象能夠處理同一個請求,具體哪一個對象處理該請求由運行時刻自動肯定。
二、在不明確指定接收者的狀況下,向多個對象中的一個提交一個請求。
三、可動態指定一組對象處理請求。
一、下降耦合度。它將請求的發送者和接收者解耦。
二、簡化了對象。使得對象不須要知道鏈的結構。
三、加強給對象指派職責的靈活性。經過改變鏈內的成員或者調動它們的次序,容許動態地新增或者刪除責任。
四、增長新的請求處理類很方便。
一、不能保證請求必定被接收。
二、系統性能將受到必定影響,並且在進行代碼調試時不太方便,可能會形成循環調用。
三、可能不容易觀察運行時的特徵,有礙於除錯。
#經理類 class Manager: successor=None name='' def __init__(self,name): self.name=name #設置上級 def setSuccessor(self,successor): self.successor=successor #處理請求 def handleRequest(self,request): pass #直屬經理 class LineManager(Manager): def handleRequest(self,request): if request.requestType=='little' : print('requestType: %s ,requestContent: %s,' %(request.requestType,request.requestContent)) print('小事一樁,我這個小小的line manager就能搞定') else: if self.successor !=None: print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent)) print('非小事,我這個小小的line manager無能爲力,交上級處理') print('上級是:',self.successor) self.successor.handleRequest(request) #部門經理 class DepartmentManager(Manager): def handleRequest(self,request): if request.requestType=='middle' : print('requestType: %s ,requestContent: %s ' %(request.requestType,request.requestContent)) print('中級事件,我這個department manager就能搞定') else: if self.successor !=None: print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent)) print('非中級事件,我這個department manager無能爲力,交上級處理' ) print('上級是:',self.successor) self.successor.handleRequest(request) def __str__(self): return 'Department Manager ' #總經理 class GeneralManager(Manager): def handleRequest(self,request): if request.requestType=='big' : print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent)) print('大事件,得由我這個 general manager拍板') def __str__(self): return 'General Manager ' class Request(): def __init__(self,requestType,requestContent): self.requestType=requestType self.requestContent=requestContent def commit(self,manager): ret=manager.handleRequest(self) if __name__=='__main__': line_manager=LineManager('Line Manager') department_manager=DepartmentManager('Department Manager') general_manager=GeneralManager('General Manager') line_manager.setSuccessor(department_manager) department_manager.setSuccessor(general_manager) print('==========================================================') request=Request('little','請批准團隊外出腐敗經費1000元') request.commit(line_manager) print('==========================================================') request=Request('middle','請批准團隊外出旅遊10000元') request.commit(line_manager) print('==========================================================') request=Request('big','請批准團隊設備購買100000元') request.commit(line_manager)
例子是我參考了csdn上的一篇博客(連接參考下面),我按照本身的理解,作了些更改,如發現錯誤之處,請留言更正,thanks。
參考
https://blog.csdn.net/baidu_15113429/article/details/85760002
https://www.jianshu.com/p/75946acd80e3
https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html
https://zhidao.baidu.com/question/268801834417526925.html
https://www.cnblogs.com/z-test/p/9319116.html
https://www.cnblogs.com/chenpi/p/5217038.html