Python設計模式-職責鏈模式

小屋子大俠發表於2017-06-24

Python設計模式-職責鏈模式

程式碼基於3.5.2,程式碼如下;

#coding:utf-8
#職責鏈模式

class Handler():
    def __init__(self):
        self.successor = None
    def setSuccseeor(self,successor):
        self.successor = successor
    def handleRequest(self,request):
        raise NotImplementedError

class ConcreteHandle1(Handler):
    def handleRequest(self,request):
        if request >=0 and request <10:
            print("ConcreteHandle1 處理了 {0}".format(request))
        else:
            if self.successor != None:
                self.successor.handleRequest(request)
            else:
                print("沒有對應物件處理該請求")


class ConcreteHandle2(Handler):
    def handleRequest(self,request):
        if request >=10 and request <20:
            print("ConcreteHandle2 處理了 {0}".format(request))
        else:
            if self.successor != None:
                self.successor.handleRequest(request)
            else:
                print("沒有對應物件處理該請求")

class ConcreteHandle3(Handler):
    def handleRequest(self,request):
        if request >=20 and request <30:
            print("ConcreteHandle3 處理了 {0}".format(request))
        else:
            if self.successor != None:
                self.successor.handleRequest(request)
            else:
                print("沒有對應物件處理該請求")

if __name__ == "__main__":
    c1 = ConcreteHandle1()
    c2 = ConcreteHandle2()
    c3 = ConcreteHandle3()
    c2.setSuccseeor(c1)
    c3.setSuccseeor(c2)

    c3.handleRequest(8)
    c3.handleRequest(12)
    c3.handleRequest(24)
    c3.handleRequest(50)

職責鏈模式分析與解讀

職責鏈模式

職責鏈模式,使多個物件都有機會處理請求,從而避免請求的傳送者和接受者之間的耦合關係。將這個物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。

程式碼解讀

1、先定義了Handler類,所以繼承該類的類需要實現handleRequest方法,並且setSuccseeor方法為設定噹噹前物件無法處理該請求時,處理該請求的下一級物件;
2、定義了三個繼承自Handler類的ConcreteHandle1,ConcreteHandle2和ConcreteHandle3,分別實現了handleRequest方法,通過判讀輸入request來判斷是否可以處理該請求;
3、在客戶端呼叫時,通過將例項c1,c2,c3,通過setSuccseeor方法來設定處理請求的上一級從而使得三個例項構成一條處理鏈,此時的入口例項便是c3,通過將請求出入c3的handleRequest方法,從而完成請求的傳遞。

程式碼執行結果如下:

”’
ConcreteHandle1 處理了 8
ConcreteHandle2 處理了 12
ConcreteHandle3 處理了 24
沒有對應物件處理該請求
”’

職責鏈模式應用場景:

1、若一個請求可能由一個懟請求有鏈式優先順序的處理群所處理時,可以考慮責任鏈模式。

優缺點分析

優點

1、將請求者與處理者分離,請求者並不知道請求是被哪個處理者所處理,易於擴充套件,降低了耦合度;
2、隨時地增加或修改處理一個請求的結構,增強了給物件指派職責的靈活性。

缺點

1、如果責任鏈比較長,會有比較大的效能問題;在業務出問題時,難定位是哪個處理者的問題。

相關文章