設計模式(十六)職責鏈模式(Chain of Responsibility)

weixin_33860553發表於2018-02-05
8157663-fb7812a5491db247.png
職責鏈.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天,公司無法批准
我管不了,你去找部門領導處理吧
請假時間太長了,我管不了,你去找上面領導吧
你可以另謀高就了

'''

相關文章