浅谈Python设计模式 -- 责任链模式
声明:本系列文章主要参考《精通Python设计模式》一书,并且参考一些资料,结合自己的一些看法来总结而来。
之前在最开始就聊了Python设计模式有三种,其中关于创建型和结构型设计模式基本都已经聊了,那么现在来聊聊关于Python设计模式的 行为型设计模式 。
行为型设计模式:
用来处理系统实体之间通信的设计模式。
接下来,聊一下关于行为型设计模式的第一种 -- 责任链模式。
责任链模式
根据《精通Python设计模式》书中介绍如下:
责任链模式 -- 用于让多个对象处理一个请求时,或者用于预先不知道由哪个对象来处理某种特定请求时,其原则如下:
1、存在一个对象链(链表、树或者其他便捷的数据结构)。
2、一开始将请求发送给第一个对象,让其处理。
3、对象决定是否处理该请求。
4、对象将请求转发给下一个对象。
5、重复该过程,直到达到链尾。
可能看概念介绍还会很模糊,那么接下来看一下需求吧。
需求
假设有这么一个请假系统:员工若想要请3天以内(包括3天的假),只需要直属经理批准就可以了;如果想请3-7天,不仅需要直属经理批准,部门经理需要最终批准;如果请假大于7天,不光要前两个经理批准,也需要总经理最终批准。类似的系统相信大家都遇到过,那么该如何实现呢?首先想到的当然是if…else…,但一旦遇到需求变动,其臃肿的代码和复杂的耦合缺点都显现出来。简单分析下需求,“假条”在三个经理间是单向传递关系,像一条链条一样,因而,我们可以用一条“链”把他们进行有序连接。
示例:
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 == 'DaysOff' and request.number <= 3:
return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
else:
return '%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number)
if self.successor != None:
self.successor.handleRequest(request) class DepartmentManager(Manager):
'''部门经理'''
def handleRequest(self, request):
if request.requestType == 'DaysOff' and request.number <= 7:
return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number)
else:
return '%s:%s Num:%d Accepted CONTINUE' % (self.name, request.requestContent, request.number)
if self.successor != None:
self.successor.handleRequest(request) class GeneralManager(Manager):
'''总经理'''
def handleRequest(self, request):
if request.requestType == 'DaysOff':
return '%s:%s Num:%d Accepted OVER' % (self.name, request.requestContent, request.number) class Request():
def __init__(self, requestType ,requestContent, number = 0):
self.requestType = requestType
self.requestContent = requestContent
self.number = number def commit(self,generalManager):
ret = generalManager.handleRequest(self)
print(ret)
return ret
分析:
1、有一个Request类,用来构建请求,同时调用commit方法提高到责任链的首段即 lineManager对象 来处理。
2、lineManager在处理该请求时,去校验是否为 请假类型和请假天数,若为请求天数 > 3天,则判断是否有上级,若有则调用上级即 departManager对象来处理。
3、部门领导如上,若请求天数 > 7天则提交给总经理 generalManager来处理,直到责任链的尾端。
4、责任链处理到尾端,则返回处理结果,当然该示例中没有结果返回。
使用:
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) request = Request(requestContent="'Ask 1 day off'", requestType='DaysOff', number=1)
request.commit(line_manager) request = Request(requestContent="'Ask 5 day off'", requestType='DaysOff', number=5)
request.commit(line_manager) request = Request(requestContent="'Ask 10 day off'", requestType='DaysOff', number=10)
request.commit(line_manager)
上述代码案例:用编程专业术语来说是一个单向链表,若 经理也可以发布任务,给其下级,其下级处理了再发给下下级~~,以此类推,则 可以实现一个双向链表。
这种链表组织:可以解耦发送方 和接收方。即 请求只需发送给 直属经理即可。而下方任务,只需发送给部门经理即可。
该模式的优缺点:
优点:
1、将请求者与处理者分离,请求者并不知道请求是被哪个处理者所处理,易于扩展。
缺点:
1、如果责任链比较长,会有比较大的性能问题;
2、如果责任链比较长,若业务出现问题,比较难定位是哪个处理者的问题。
应用场景:
2、若一个请求可能由一个对请求有链式优先级的处理群所处理时,可以考虑责任链模式。除本例外,银行的客户请求处理系统也可以用责任链模式实现(VIP客户和普通用户处理方式当然会有不同)。
over~~~
浅谈Python设计模式 -- 责任链模式的更多相关文章
- 浅谈Python设计模式 - 享元模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 享元模式: 享元模式是一种用于解决资源和性能压力时会使用到的设计模式,它的核心思 ...
- 浅谈Python设计模式 - 抽象工厂模式
声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...
- java 设计模式 -- 责任链模式
设计模式 – 责任链模式 介绍: 责任链模式是一种动态行为模式,有多个对象,每一个对象分别拥有其下家的引用.连起来形成一条链.待处理对象则传到此链上,在此链进行传递,且待处理对象并不知道此会被链上的哪 ...
- 【设计模式】Java设计模式 - 责任链模式
[设计模式]Java设计模式 - 责任链模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 一个有梦有戏的人 @怒放吧德德 目录 [设计模式]Java设计模式 - 责 ...
- 我的Java设计模式-责任链模式
今天来说说程序员小猿和产品就关于需求发生的故事.前不久,小猿收到了产品的需求. 产品经理:小猿,为了迎合大众屌丝用户的口味,我们要放一张图,要露点的. 小猿:......露点?你大爷的,让身为正义与纯 ...
- Java设计模式-责任链模式
提出问题: 最初接触责任链模式就是在struts2中,在当时学的时候看了一眼,大概知道了原理,最近在复习,模拟struts2,说是模拟只是大体模拟了struts2的工作流程,很多东西都是写死的,只是为 ...
- Java设计模式の责任链模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其 ...
- Java与设计模式-责任链模式
责任链模式属于行为型设计模式之中的一个,怎么理解责任链?责任链是能够理解成数个对象首尾连接而成,每个节点就是一个对象.每个对象相应不同的处理逻辑,直至有一个对象响应处理请求结束.这一种模式成为责任链模 ...
- php设计模式-责任链模式
责任链模式更像是一种简化多种场景下调用处理的一种设计模式,特别适合if-else分支判断很多的场景.比如是根据不同会员等级给予不同的优惠力度. 它的定义:对象的调用是由下家的应用连接起来的处理链.一直 ...
随机推荐
- monkey--介绍
前戏 monkey程序是android系统自带的,其启动脚本是位于android系统的/system/bin目录的monkey文件,其jar包是位于android系统的/system/framewor ...
- (转)简单的Malloc实现
现在,一般来说,我们可以实现malloc使得对malloc的调用将会被映射到系统调用sbrk上,sbrk(n)将会移动程序中断的位置-也就是程序的data段的最后.-偏移n个字节,这意味着,n个字节的 ...
- 学好Python后可从事岗位+学习Python的难度
一.学好Python好就业: 1.Linux运维.Linux运维是必须而且一定要掌握Python语言,Python可以满足Linux运维工程师的工作需求提升效率,总而提升自己的能力.用Python实现 ...
- Spring Boot 知识笔记(热部署)
热部署原理: 使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader ...
- 第02组 团队Git现场编程实战
目录 1. 组员职责分工(2分) 2. github 的提交日志截图(1分) 3. 程序运行截图(3分) 4. 程序运行环境(1分) 5. GUI界面(5分) 6. 基础功能实现(10分) 7. 鼓励 ...
- python总结二
1.在命令行:dd是删除光标所在的那一整行 yy是复制光标所在的那一整行 p是将已复制的数据在光标的下一行粘贴 P是将已复制的数据在光标的上一行粘贴 2.在命令行中查找的话 从上往下查找:/ 从下往上 ...
- 深入理解 JavaScript 中的 class
在 ES6 规范中,引入了 class 的概念.使得 JS 开发者终于告别了,直接使用原型对象模仿面向对象中的类和类继承时代. 但是JS 中并没有一个真正的 class 原始类型, class 仅仅只 ...
- 用简单的JS代码制作计算器
代码+注释一共不到200行,是练习交流的必备良药 主界面如下: 操作示意图: 以下是代码部分 HTML: <div> <table class="window"& ...
- spark 资源动态分配
'spark.shuffle.service.enabled': 'true', 'spark.dynamicAllocation.enabled': 'false', , , , 'spark.sq ...
- HashMap源码1
jdk1.8之前是数组+链表的形式,后面会介绍jdk1.8对hashMap的改动:数组+链表+红黑树 transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分. 当一个对象被串 ...