13 Python與設計模式 責任鏈模式

2021-09-23 17:47:48 字數 3435 閱讀 3118

假設有這麼乙個請假系統:員工若想要請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...