天天看點

06-11-設計模式 職責鍊模式

學校OA系統的采購審批項目

采購員采購教學器材

1)如果金額小于等于5000,由教學主任審批(0<=x<=5000)

2)如果金額小于等于10000,由院長審批(5000<x<=10000)

3)如果金額小于等于30000,由副校長審批(10000<x<=30000)

4)如果金額超過30000以上,有校長審批(30000<x)

請設計程式完成采購審批項目

傳統方案

06-11-設計模式 職責鍊模式

傳統方案問題分析

1)傳統方式是:接收到一個采購請求後,根據采購金額來調用對應的Approver(審批人)完成審批。

2)傳統方式的問題分析:用戶端這裡會使用到分支判斷(比如switch)來對不同的采購請求處理,這樣就存在如下問題

(1)如果各個級别的人員審批金額發生變化,在用戶端的也需要變化

(2)用戶端必須明确的知道有多少個審批級别和通路

3)這樣對一個采購請求進行處理和Approver(審批人)就存在強耦合關系,不利于代碼的擴充和維護

4)解決方案=》職責鍊模式

職責鍊模式

基本介紹

1)職責鍊模式(ChainofResponsibilityPattern),又叫責任鍊模式,為請求建立了一個接收者對象的鍊(簡單示意圖)。這種模式對請求的發送者和接收者進行解耦。

2)職責鍊模式通常每個接收者都包含對另一個接收者的引用。如果一個對象不能處理該請求,那麼它會把相同的請求傳給下一個接收者,依此類推。

3)這種類型的設計模式屬于行為型模式

原理類圖

06-11-設計模式 職責鍊模式

對原理類圖的說明-即(職責鍊模式的角色及職責)

1)Handler:抽象的處理者,定義了一個處理請求的接口,同時含義另外Handler

2)ConcreteHandlerA,B是具體的處理者,處理它自己負責的請求,可以通路它的後繼者(即下一個處理者),如果可以處理目前請求,則處理,否則就将該請求交個後繼者去處理,進而形成一個職責鍊

3)Request,含義很多屬性,表示一個請求

職責鍊模式解決OA系統采購審批

類圖

06-11-設計模式 職責鍊模式

源碼剖析

SpringMvc源碼

SpringMVC-HandlerExecutionChain類就使用到職責鍊模式

06-11-設計模式 職責鍊模式

對源碼總結

springmvc請求的流程圖中,執行了攔截器相關方法interceptor.preHandler等等

在處理SpringMvc請求時,使用到職責鍊模式還使用到擴充卡模式

HandlerExecutionChain主要負責的是請求攔截器的執行和請求處理,但是他本身不處理請求,隻是将請求配置設定給鍊上注冊處理器執行,這是職責鍊實作方式,減少職責鍊本身與處理邏輯之間的耦合,規範了處理流程

HandlerExecutionChain維護了HandlerInterceptor的集合,可以向其中注冊相應的攔截器.

職責鍊模式的注意事項和細節

1)将請求和處理分開,實作解耦,提高系統的靈活性

2)簡化了對象,使對象不需要知道鍊的結構

3)性能會受到影響,特别是在鍊比較長的時候,是以需控制鍊中最大節點數量,一般通過在Handler中設定一個最大節點數量,在setNext()方法中判斷是否已經超過閥值,超過則不允許該鍊建立,避免出現超長鍊無意識地破壞系統性能

繼續閱讀