【程序设计】Python的责任链模式

责任链模式的定义如下:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求直到有对象处理它为止

优点:
1、将请求者与处理者分离,请求者并不知道请求是被哪个处理者所处理,易于扩展。


应用场景:
1、若一个请求可能由一个对请求有链式优先级的处理群所处理时,可以考虑责任链模式。除本例外,银行的客户请求处理系统也可以用责任链模式实现(VIP客户和普通用户处理方式当然会有不同)。

缺点
1、如果责任链比较长,会有比较大的性能问题;
2、如果责任链比较长,若业务出现问题,比较难定位是哪个处理者的问题。


流程图:



python代码实现:

"""

责任链模式

假设有这么一个请假系统:
员工若想要请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:
            print ('%s:%s Num:%d 接受' % (self.name, request.requestContent, request.number))
        else:
            print ('%s:%s Num:%d 接受继续' % (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:
            print ('%s:%s Num:%d 接受' % (self.name, request.requestContent, request.number))
        else:
            print ('%s:%s Num:%d 接受继续' % (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':
            print ('%s:%s Num:%d 接受' % (self.name, request.requestContent, request.number))


class request():
    requestType = ''
    requestContent = ''
    number = 0


if  __name__=="__main__":
    line_manager = lineManager('连接经理')
    department_manager = departmentManager('部门经理')
    general_manager = generalManager('总经理')

    line_manager.setSuccessor(department_manager)
    department_manager.setSuccessor(general_manager)

    req = request()
    req.requestType = 'DaysOff'
    req.requestContent = 'Ask 1 day off'
    req.number = 1
    line_manager.handleRequest(req)

    req.requestType = 'DaysOff'
    req.requestContent = 'Ask 5 days off'
    req.number = 5
    line_manager.handleRequest(req)

    req.requestType = 'DaysOff'
    req.requestContent = 'Ask 10 days off'
    req.number = 10
    line_manager.handleRequest(req)




原文:https://yq.aliyun.com/articles/71074?spm=a2c4e.11153940.blogcont280715.21.175692aawkXRdB

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值