假設有這麼乙個請假系統:員工若想要請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 accepted over' % (self.name, request.requestcontent, request.number)
else:
print '%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:
print '%s:%s num:%d accepted over' % (self.name, request.requestcontent, request.number)
else:
print '%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':
print '%s:%s num:%d accepted over' % (self.name, request.requestcontent, request.number)
class request():
requesttype = ''
requestcontent = ''
number = 0
request類封裝了假期請求。在具體的經理類中,可以通過setsuccessor介面來構建「責任鏈」,並在handlerequest介面中實現邏輯。場景類中實現如下:
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)
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)
列印如下:
line manager:ask 1 day off num:1 accepted over
line manager:ask 5 days off num:5 accepted continue
department manager:ask 5 days off num:5 accepted over
line manager:ask 10 days off num:10 accepted continue
department manager:ask 10 days off num:10 accepted continue
general manager:ask 10 days off num:10 accepted over
責任鏈模式的定義如下:使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
需要說明的是,責任鏈模式中的應該只有乙個處理者,也就是說,本例中的「最終批准」為該物件所謂的「請求處理」。
優點:1、將請求者與處理者分離,請求者並不知道請求是被哪個處理者所處理,易於擴充套件。
應用場景:
1、若乙個請求可能由乙個對請求有鏈式優先順序的處理群所處理時,可以考慮責任鏈模式。除本例外,銀行的客戶請求處理系統也可以用責任鏈模式實現(vip客戶和普通使用者處理方式當然會有不同)。
1、如果責任鏈比較長,會有比較大的效能問題;
2、如果責任鏈比較長,若業務出現問題,比較難定位是哪個處理者的問題。
1 3 Python語法初探
input輸入 螢幕輸入 input 的小括號中放入的是,提示資訊,用來在獲取資料之前給使用者的乙個簡單提示 input 在從鍵盤獲取了資料以後,會存放到等號右邊的變數中 input 會把使用者輸入的任何值都作為字串來對待 str input 請輸入 請輸入 這裡是輸入完 直接的輸出 str inp...
23種設計模式 13 責任鏈模式
使多個物件都有機會處理請求,從而避免請求的傳送者和接受者質檢的耦合關係。將這個接收物件連成一條鏈,並沿著這條鏈傳遞請求,直到有乙個物件處理他為止。先來看乙個反面例子 使用大量的if判斷來選擇執行邏輯 public response handlerequest request request else...
13 Python裝飾器(一)
一 在python中函式也可以作為另乙個函式的引數,不限制是字串 陣列 集合 數字等。下面看乙個例子 coding utf 8 def sum x,y return x y def sub x,y return x y def test fun,x,y return fun x,y print su...