python 設計模式之 (Chain of Responsibility)責任鏈模式

#寫在前面

對於每一種設計模式,若是不理解它的原理和結構,是寫不出例子來的。因此弄明白很重要。html

等過完這段渾渾噩噩的日子,我要找個遍地開花的地方開懷大笑一場python

 

#責任鏈模式定義

簡書上一網友就把這個定義就說的挺清楚,下面有參考鏈接。明明簡簡單單的事情,百科上非要寫的文縐縐的,很拗口,又晦澀設計模式

 責任鏈模式就是這種「推卸」責任的模式,你的問題在我這裏能解決我就解決,不行就把你推給另外一個對象。至於到底誰解決了這個問題了呢?我管呢!mybatis

 

# 責任鏈模式由兩個角色組成:

1) 抽象處理者角色(Handler):它定義了一個處理請求的接口。固然對於鏈子的不一樣實現,也能夠在這個角色中實現後繼鏈。
2) 具體處理者角色(Concrete Handler):實現抽象角色中定義的接口,並處理它所負責的請求。若是不能處理則訪問它的後繼者。框架

 

 

 # 應用實例

1.紅樓夢中的擊鼓傳花jsp

2.JS中的事件冒泡性能

3.JAVA WEB中的Apache Tomcat對Encoding的處理.net

4.Struts2d 的攔截器設計

5.jsp servlet的filter,servlet中的filter
6.dubbo中的filter
7. mybatis中的plugin 這3個框架在實現責任鏈方式不盡相同。調試

後面這些我也不太瞭解,

 

 #使用場景

一、有多個對象能夠處理同一個請求,具體哪一個對象處理該請求由運行時刻自動肯定。

二、在不明確指定接收者的狀況下,向多個對象中的一個提交一個請求。

三、可動態指定一組對象處理請求。

 

#優勢

一、下降耦合度。它將請求的發送者和接收者解耦。

二、簡化了對象。使得對象不須要知道鏈的結構。

三、加強給對象指派職責的靈活性。經過改變鏈內的成員或者調動它們的次序,容許動態地新增或者刪除責任。

四、增長新的請求處理類很方便。

 

#缺點

一、不能保證請求必定被接收。

二、系統性能將受到必定影響,並且在進行代碼調試時不太方便,可能會形成循環調用。

三、可能不容易觀察運行時的特徵,有礙於除錯。

 

 

 

 #舉個栗子

#經理類
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=='little' :
            print('requestType: %s ,requestContent: %s,' %(request.requestType,request.requestContent))
            print('小事一樁,我這個小小的line manager就能搞定')
        else:
            if self.successor !=None:
                print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))
                print('非小事,我這個小小的line manager無能爲力,交上級處理')
                print('上級是:',self.successor)
                self.successor.handleRequest(request)

#部門經理
class DepartmentManager(Manager):
    def handleRequest(self,request):
        if request.requestType=='middle' :
            print('requestType: %s ,requestContent: %s ' %(request.requestType,request.requestContent))
            print('中級事件,我這個department manager就能搞定')
        else:
            if  self.successor !=None:                
                print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))
                print('非中級事件,我這個department manager無能爲力,交上級處理' )
                print('上級是:',self.successor)
                self.successor.handleRequest(request)

    def __str__(self):
        return 'Department Manager '

#總經理
class GeneralManager(Manager):
    def handleRequest(self,request):
        if request.requestType=='big' :
            print('requestType: %s ,requestContent: %s' %(request.requestType,request.requestContent))
            print('大事件,得由我這個 general manager拍板')

    def __str__(self):
        return 'General Manager '

class Request():
    def __init__(self,requestType,requestContent):
        self.requestType=requestType
        self.requestContent=requestContent

    def commit(self,manager):
        ret=manager.handleRequest(self)


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)

    print('==========================================================')
    request=Request('little','請批准團隊外出腐敗經費1000元')
    request.commit(line_manager)

    print('==========================================================')
    request=Request('middle','請批准團隊外出旅遊10000元')
    request.commit(line_manager)

    print('==========================================================')
    request=Request('big','請批准團隊設備購買100000元')
    request.commit(line_manager)

 

  例子是我參考了csdn上的一篇博客(連接參考下面),我按照本身的理解,作了些更改,如發現錯誤之處,請留言更正,thanks。

 

參考

https://blog.csdn.net/baidu_15113429/article/details/85760002

https://www.jianshu.com/p/75946acd80e3

https://www.runoob.com/design-pattern/chain-of-responsibility-pattern.html

https://zhidao.baidu.com/question/268801834417526925.html

https://www.cnblogs.com/z-test/p/9319116.html

https://www.cnblogs.com/chenpi/p/5217038.html

相關文章
相關標籤/搜索