设计模式(十六)职责链模式(Chain of Responsibility)

职责链.png

思想:层级处理,直到某一级可以处理
意图:
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用性:
有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
可处理一个请求的对象集合应被动态指定。

案例一:

#_*_coding:utf-8_*_
# 职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,
从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,
直到有一个对象处理它为止。
# 适用场景:
# 1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定;
# 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求;
# 3、处理一个请求的对象集合应被动态指定。
 
class BaseHandler(object):
    '''处理基类'''
 
 
    def successor(self,successor):
        #与下一个责任者关联
        self._successor = successor
 
class RequestHandlerL1(BaseHandler):
    '''第一级请求处理者'''
    name = "TeamLeader"
    def handle(self,request):
        if request < 500 :
            print("审批者[%s],请求金额[%s],审批结果[审批通过]"%(self.name,request))
        else:
            print("\033[31;1m[%s]无权审批,交给下一个审批者\033[0m" %self.name)
            self._successor.handle(request)
 
class RequestHandlerL2(BaseHandler):
    '''第二级请求处理者'''
    name = "DeptManager"
    def handle(self,request):
        if request < 5000 :
            print("审批者[%s],请求金额[%s],审批结果[审批通过]"%(self.name,request))
        else:
            print("\033[31;1m[%s]无权审批,交给下一个审批者\033[0m" %self.name)
            self._successor.handle(request)
 
class RequestHandlerL3(BaseHandler):
    '''第三级请求处理者'''
    name = "CEO"
    def handle(self,request):
        if request < 10000 :
            print("审批者[%s],请求金额[%s],审批结果[审批通过]"%(self.name,request))
        else:
            print("\033[31;1m[%s]要太多钱了,不批\033[0m"%self.name)
            #self._successor.handle(request)
 
class RequestAPI(object):
    h1 = RequestHandlerL1()
    h2 = RequestHandlerL2()
    h3 = RequestHandlerL3()
 
    h1.successor(h2)
    h2.successor(h3)
    def __init__(self,name,amount):
        self.name = name
        self.amount = amount
 
 
 
    def handle(self):
 
        '''统一请求接口'''
        self.h1.handle(self.amount)
 
 
if __name__ == "__main__":
    r1 = RequestAPI("Alex",30000)
    r1.handle()
    print(r1.__dict__)

案例二:

class TeamLeader:
    def __init__(self,name='Teamleader',successor=None):
        self.__name=name
        self.__successor=successor

    def handle(self,day):
        if day<=1:
            print("回去休息吧")

        else:
            print("我管不了,你去找部门领导处理吧")
            self.__successor.handle(day)


class DaptLeader:
    def __init__(self,name='DaptLeader',successor=None):
        self.__name=name
        self.__successor=successor

    def handle(self,day):
        if day<3:
            print("好吧,你回去好好休息")

        else:
            print("请假时间太长了,我管不了,你去找上面领导吧")
            self.__successor.handle(day)

class Boss:
    def __init__(self,name='Boss'):
        self.__name=name

    def handle(self,day):
        if day<=5:
            print("好好休息,公司还很需要你啊")
        else:
            print("你可以另谋高就了")

boss=Boss()
daptleader=DaptLeader(successor=boss)
teamleader=TeamLeader(successor=daptleader)
# 1.请假1天,teamleader就可以批准
teamleader.handle(1)
# 2.请假2天,需要daptleader可以批准
teamleader.handle(2)
# 3.请假3天,需要boss批准
teamleader.handle(3)
# 4.请假超过5天,公司无法批准
teamleader.handle(6)
'''

运行结果:

'''
# 1.请假1天,teamleader就可以批准
回去休息吧

# 2.请假2天,需要daptleader可以批准
我管不了,你去找部门领导处理吧
好吧,你回去好好休息

# 3.请假3天,需要boss批准
我管不了,你去找部门领导处理吧
请假时间太长了,我管不了,你去找上面领导吧
好好休息,公司还很需要你啊

# 4.请假超过5天,公司无法批准
我管不了,你去找部门领导处理吧
请假时间太长了,我管不了,你去找上面领导吧
你可以另谋高就了

'''

你可能感兴趣的:(设计模式(十六)职责链模式(Chain of Responsibility))