設計模式(十六)職責鏈模式(Chain of Responsibility)
思想:層級處理,直到某一級可以處理
意圖:
使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。
適用性:
有多個的物件可以處理一個請求,哪個物件處理該請求執行時刻自動確定。
你想在不明確指定接收者的情況下,向多個物件中的一個提交一個請求。
可處理一個請求的物件集合應被動態指定。
案例一:
#_*_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)設計模式AI
- (轉)職責鏈設計模式(Chain of Responsibility)設計模式AI
- 職責鏈模式(chain of responsibility)模式AI
- C++設計模式——職責鏈模式( Chain of Responsibility Pattern)C++設計模式AI
- C#設計模式系列:職責鏈模式(Chain of Responsibility)C#設計模式AI
- JAVA設計模式之 職責鏈模式【Chain of Responsibility Pattern】Java設計模式AI
- c/c++ 設計模式-----職責鏈(Chain Of Responsibility)模式C++設計模式AI
- 設計模式的征途—14.職責鏈(Chain of Responsibility)模式設計模式AI
- 責任鏈模式(Chain Of Responsibility)模式AI
- C#設計模式-責任鏈模式(Chain of Responsibility Pattern)C#設計模式AI
- Chain of responsibility-責任鏈模式AI模式
- 設計模式-職責鏈模式設計模式
- 設計模式之-職責鏈模式設計模式
- 設計模式之【職責鏈模式】設計模式
- 設計模式系列 12– 職責鏈模式設計模式
- 簡說設計模式——職責鏈模式設計模式
- Javascript設計模式之職責鏈模式JavaScript設計模式
- JS設計模式五:職責鏈模式JS設計模式
- Python設計模式-職責鏈模式Python設計模式
- javascript設計模式 之 10 職責鏈模式JavaScript設計模式
- C#設計模式之職責鏈模式C#設計模式
- PHP實現職責鏈設計模式PHP設計模式
- 實話設計模式之:職責鏈設計模式
- 職責鏈模式模式
- 軟體設計模式學習(十七)職責鏈模式設計模式
- Chain of Responsibility模式疑問AI模式
- 設計模式 —— 責任鏈模式設計模式
- 設計模式-責任鏈模式設計模式
- 設計模式(責任鏈模式)設計模式
- 設計模式——責任鏈模式設計模式
- 《JavaScript設計模式與開發實踐》模式篇(10)—— 職責鏈模式JavaScript設計模式
- 設計模式(三) 責任鏈模式設計模式
- 設計模式(十四) 責任鏈模式設計模式
- 設計模式(十八):責任鏈模式設計模式
- 設計模式之——責任鏈模式設計模式
- 設計模式之責任鏈模式設計模式
- 設計模式 - 單一職責設計模式
- 設計模式(二十四)——職責鏈模式(SpringMVC原始碼分析)設計模式SpringMVC原始碼