1. 程式人生 > 其它 >Python之責任鏈模式

Python之責任鏈模式

一、介紹

責任鏈模式(Chain of Responsibility Pattern)為請求建立了一個接收者物件的鏈。這種模式給予請求的型別,對請求的傳送者和接收者進行解耦。這種型別的設計模式屬於行為型模式

在這種模式中,通常每個接收者都包含對另一個接收者的引用。如果一個物件不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。

意圖:避免請求傳送者與接收者耦合在一起,讓多個物件都有可能接收請求,將這些物件連線成一條鏈,並且沿著這條鏈傳遞請求,直到有物件處理它為止。

主要解決:職責鏈上的處理者負責處理請求,客戶只需要將請求傳送到職責鏈上即可,無須關心請求的處理細節和請求的傳遞,所以職責鏈將請求的傳送者和請求的處理者解耦了。

二、責任鏈模式

1、責任鏈的結構和應用場景

結構:

  1. 抽象處理者:定義了處理請求的抽象方法和一個設定責任鏈的下一個處理者的方法。
  2. 具體處理者:實現處理請求的方法,判斷自己能否處理本次請求,如果能,則處理,如果不能,則把請求轉發給責任鏈的下一個處理者。
  3. 客戶類:建立處理鏈,對鏈頭提交請求,並不需要關心處理細節。

處理原則:

  1. 客戶類發起請求,建立一個責任鏈。
  2. 將請求傳送給第一個物件,讓其處理。
  3. 此時物件判斷是否可以處理該請求。
  4. 若可以,則進行處理。
  5. 若不可以,則把請求轉發給下一個物件。
  6. 下一個物件判斷是否可以處理該請求,重複該過程(3、4、5),直到達到鏈尾。

使用場景:

  1. 若某個請求可以由多個物件進行處理,但具體由哪個物件處理該請求則是由請求內容和物件處理許可權確定。
  2. 在請求處理者不明確的情況下,對多個處理者中的一個提交請求。
  3. 需要動態處理一組物件處理請求,比如新增新的處理者。

2、示例

假設現在有一個員工管理系統:
1.外出公幹時間少於3天的申請,由專案經理審批即可
2.外出公幹時間大於3天小於7天的申請,需要專案經理審批完之後,再由部門主管進行審批
3.外出公幹時間大於7天的申請,不僅需要專案經理和部門主管進行審批,還需要總經理進行最後的審批

那麼我們使用責任鏈模式進行處理

import abc


class Manager(metaclass=abc.ABCMeta):
    """抽象處理者"""

    def __init__(self, name):
        self.superior 
= None # 責任鏈的下一個處理者 self.name = name def setSuperior(self, superior): # 設定責任鏈的下一個處理者 self.superior = superior @abc.abstractmethod def handleRequest(self, clientRequest): # 處理請求 pass class ProjectManager(Manager): """具體處理者:專案經理""" def handleRequest(self, clientRequest): if clientRequest.applicationType == "business" and clientRequest.businessDay <= 3: return "外出公幹%s天,%s審批意見:OK,審批結束" % ( clientRequest.businessDay, self.name) else: print("外出公幹%s天,%s審批意見:OK,審批由%s繼續處理" % ( clientRequest.businessDay, self.name, self.superior.name)) return self.superior.handleRequest(clientRequest) class DepartmentHead(Manager): """具體處理者:部門主管""" def handleRequest(self, clientRequest): if clientRequest.applicationType == "business" and clientRequest.businessDay <= 7: return "外出公幹%s天,%s審批意見:OK,審批結束" % ( clientRequest.businessDay, self.name) else: print("外出公幹%s天,%s審批意見:OK,審批由%s繼續處理" % ( clientRequest.businessDay, self.name, self.superior.name)) return self.superior.handleRequest(clientRequest) class President(Manager): """具體處理者:總經理""" def handleRequest(self, clientRequest): if clientRequest.applicationType == "business": return "%s審批意見:OK,審批結束" % self.name class Client(object): """客戶類:發起請求""" def __init__(self, applicationType, businessDay): self.applicationType = applicationType self.businessDay = businessDay def submit(self, manager): response = manager.handleRequest(self) print(response) return response if __name__ == '__main__': # 初始化責任鏈 project_manager = ProjectManager('專案經理') department_head = DepartmentHead('部門主管') president = President('總經理') project_manager.setSuperior(department_head) # 專案經理的上級是部門主管 department_head.setSuperior(president) # 部門主管的上級是總經理 # 客戶類進行請求 client = Client(applicationType="business", businessDay=2) client.submit(project_manager) print("-------------------------- request 1 end --------------------------") client = Client(applicationType="business", businessDay=6) client.submit(project_manager) print("-------------------------- request 2 end --------------------------") client = Client(applicationType="business", businessDay=14) client.submit(project_manager) print("-------------------------- request 3 end --------------------------")

結果: