#写在前面

对于每一种设计模式,如果不理解它的原理和结构,是写不出例子来的。所以弄明白很重要。

等过完这段浑浑噩噩的日子,我要找个遍地开花的地方开怀大笑一场

#责任链模式定义

简书上一网友就把这个定义就说的挺清楚,下面有参考连接。明明简简单单的事情,百科上非要写的文绉绉的,很拗口,又晦涩

责任链模式就是这种“推卸”责任的模式,你的问题在我这里能解决我就解决,不行就把你推给另一个对象。至于到底谁解决了这个问题了呢?我管呢!

# 责任链模式由两个角色组成:

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、可能不容易观察运行时的特征,有碍于除错。

#举个栗子

#经理类
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

python 设计模式之 (Chain of Responsibility)责任链模式的更多相关文章

  1. 设计模式(13)--Chain of Responsibility(责任链模式)--行为型

    作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一 ...

  2. 设计模式(一)Chain Of Responsibility责任链模式

    设计模式篇章,源于网课的学习,以及个人的整理 在我们接收用户提交的字符时,常常会使用到过滤,在学习责任链模式前,我们是这样做的 1.定义一个类 public class MsgProcesser { ...

  3. Chain of Responsibility 责任链模式

    简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其[下家]的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...

  4. Chain of Responsibility 责任链模式 MD

    责任链模式 简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户 ...

  5. 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)

      17.1.解释 概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. main(),客户 IWom ...

  6. go语言设计模式之Chain Of Responsibility(责任链)

    ChainOfResponsibility.go package ChainOfResponsibility import ( "fmt" "io" " ...

  7. Chain of Responsibility - 责任链模式

    定义 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合度. 案例 比方如今有一个图形界面,它包含一个应用Application类,一个主窗体Window,一个buttonButton ...

  8. 设计模式19:Chain Of Responsibility 职责链模式(行为型模式)

    Chain Of Responsibility 职责链模式(行为型模式) 请求的发送者与接受者 某些对象请求的接受者可能有多种多样,变化无常…… 动机(Motivation) 在软件构建过程中,一个请 ...

  9. 【设计模式】行为型05责任链模式(Chain of responsibility Pattern)

    学习地址:http://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html demo采用了DEBUG级别举例子,理解起 ...

随机推荐

  1. (坑爹错误)记录prometheus中配置alertmanager.yml一次报错

    global: resolve_timeout: 5m #处理超时时间,默认为5min smtp_smarthost: 'smtp.sina.com:25' # 邮箱smtp服务器代理 smtp_fr ...

  2. Android笔记(八) Android中的布局——相对布局

    RelativeLayout又称为相对布局,也是一种常用的布局形式.和LinearLayout的排列规则不同,RelativeLayout显得更加随意一下,它通常通过相对定位 的方式让控件出现在布局的 ...

  3. linux复制、压缩打包、解压缩等操作

    1. 复制:cp命令,可复制一个文件夹下的所有文件和子目录.子文件,但是不包括本目录名,例如:不想包含目录名python3.7,想包含的是该目录下的所有子文件和子目录 cp -r /usr/local ...

  4. Django drf:手撸自定义跨域

    项目需求: 1.用域名8000向8001发送请求,用django框架解决跨域问题 2.用上自定义中间件配置,支持get.post.put.detele和非简单请求 3.支持版本控制 4.在settin ...

  5. Django drf: 跨域机制

    一.同源策略 二.CORS(跨域资源共享)简介 三.CORS基本流程 四.CORS两种请求流程 五.Django项目中支持CORS 一.同源策略 同源策略是一种约定,它是浏览器最核心的最基本的安全功能 ...

  6. 模仿DotnetCore中间件的方式,做一个列表过滤的功能

    我们的很多功能当中都会遇到对版本进行过滤的场合,例如你可能需要对列表中的数据的时间进行过滤.版本过滤.渠道以及地区信息进行过滤. 原本的做法:设计很多个过滤方法,通过枚举的方式组合,选择需要过滤哪些方 ...

  7. 基于Java+Selenium的WebUI自动化测试框架(九)-----基础页面类(BasePage)

    上篇我们写了java读取xml文件的类,实现了可以从xml文件读取元素的方式.那么,接下来我们需要考虑一个问题.我们拿了这些元素之后怎么去操作呢? 先来看看我们手工测试的时候是怎么进行的. 双击浏览器 ...

  8. KaTex语法说明

    参考链接: https://katex.org/docs/supported.html https://github.com/KaTeX/KaTeX/blob/master/docs/supporte ...

  9. 如果解释Python,什么是.pyc文件?

    我已经了解Python是一种解释型语言......但是,当我查看我的Python源代码时,我看到.pyc文件,Windows将其识别为“编译的Python文件”. 这些来自哪里? #1楼 Python ...

  10. 57、springmvc-整合

    57.springmvc-整合 57.1 创建Spring MVC Annotation项目 <?xml version="1.0" encoding="UTF-8 ...