对于每一种设计模式,若是不理解它的原理和结构,是写不出例子来的。因此弄明白很重要。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