Spring 設計模式之責任鏈模式


應用

  以下是一段代碼,Spring MVC 的 diapatcherServlet 的 doDispatch 方法中,獲取與請求匹配的處理器(HandlerExecutionChain)

   

 

   getHandler 方法的處理使用到了責任鏈模式,handlerMappings 是之前 Spring 容器初始化好的,通過遍歷 handlerMappings 查找與 request 匹配的 Handler, 這里返回 HandlerExecutionChain 對象。這個 HandlerExecutionChain 對象到后面執行的時候再分析為什么返回的是這樣一個對象。

 

簡介

   先來看一個圖:這里表達是一個休假申請由於實際內容的不同,按照優先級別尋找可以審批該申請的角色的一個過程。

       

     【百度百科】責任鏈模式是一種設計模式。在責任鏈模式里,很多對象由每一個對象對其下家的引用而連接起來形成一條鏈。請求在這個鏈上傳遞,直到鏈上的某一個對象決定處理此請求。發出這個請求的客戶端並不知道鏈上的哪一個對象最終處理這個請求,這使得系統可以在不影響客戶端的情況下動態地重新組織和分配責任。

    責任鏈模式在面向對象程式設計里是一種軟件設計模式,它包含了一些命令對象和一系列的處理對象。每一個處理對象決定它能處理哪些命令對象,它也知道如何將它不能處理的命令對象傳遞給該鏈中的下一個處理對象。該模式還描述了往該處理鏈的末尾添加新的處理對象的方法。

      責任鏈模式實現了請求者和處理者的解耦。

    責任鏈模式涉及到的角色如下所示:
● 抽象處理者 (Handler) 角色:定義出一個處理請求的接口。如果需要,接口可以定義 出一個方法以設定和返回對下家的引用。這個角色通常由一個Java抽象類或者Java接口實現。上圖中Handler類的聚合關系給出了具體子類對下家的引用,抽象方法handleRequest()規范了子類處理請求的操作。
● 具體處理者(ConcreteHandler)角色:具體處理者接到請求后,可以選擇將請求處理掉,或者將請求傳給下家。由於具體處理者持有對下家的引用,因此,如果需要,具體處理者可以訪問下家。

   

 【Spring MVC 中的 Handler 實現

    接口 HandlerMapping 是上圖 Handler 的代碼實現,提供了 getHandler 方法用於判斷 Hanlder 的具體實現類 ConcreteHanlder 是否可以處理該請求。如果可以處理,則返回一個 HandlerExecution 對象,里面包含一個請求處理器(a handler)和 任意個請求攔截器(any interceptors);如果不能處理,則返回 null 值。

    那么,Spring MVC 如何將所有的 ConcreteHanlder 形成一條鏈,讓某一個 ConcreteHanlder 在處理不了當前請求時可以獲取下一個 ConcreteHanlder 呢 ?

   

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM