python 设计模式之 (Chain of Responsibility)责任链模式
#写在前面
对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的。所以弄明白很重要。
等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场
#责任链模式定义
简书上一网友就把这个定义就说的挺清楚,下面有参考连接。明明简简单单的事情,百科上非要写的文绉绉的,很拗口,又晦涩
责任链模式就是这种“推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。至于到底谁解决了这个问题了呢?我管呢!
# 责任链模式由两个角色组成:
1) 抽象处理者角色(Handler):它定义了一个处理请求的接口。当然对于链子的不同实现,也可以在这个角色中实现后继链。
2) 具体处理者角色(Concrete Handler):实现抽象角色中定义的接口,并处理它所负责的请求。如果不能处理则访问它的后继者。
# 应用实例
1.红楼梦中的击鼓传花
2.JS中的事件冒泡
3.JAVA WEB中的Apache Tomcat对Encoding的处理
4.Struts2d 的拦截器
5.jsp servlet的filter,servlet中的filter
6.dubbo中的filter
7. mybatis中的plugin 这3个框架在实现责任链方式不尽相同。
后面这些我也不太了解,
#使用场景
1、有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定。
2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可动态指定一组对象处理请求。
#优点
1、降低耦合度。它将请求的发送者和接收者解耦。
2、简化了对象。使得对象不需要知道链的结构。
3、增强给对象指派职责的灵活性。通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任。
4、增加新的请求处理类很方便。
#缺点
1、不能保证请求一定被接收。
2、系统性能将受到一定影响,而且在进行代码调试时不太方便,可能会造成循环调用。
3、可能不容易观察运行时的特征,有碍于除错。
#举个栗子
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 | #经理类 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)<br> |
例子是我参考了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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架