責任鏈模式的應用實例

 

 

    對於一般的程序員而言,在平時的coding當中並沒有刻意去應用什麼模式。但最近我的一個體會就是,當你發現已完成功能的實現代碼,其侵入性非常之高;再從軟件產品整體的角度去俯瞰,該部分代碼甚至已經完全不符合OCP、SRP等原則了,需求稍有變更,就需要有傷筋動骨的改動,從而導致開發的工作量變得繁多而複雜。

 

    這就是軟件設計和實現不合理所造成的困擾。其實際來源於是我最近做的一個銀行業務軟件產品,具體情形可概述爲:當一個web請求到達的時候,去執行邏輯1,得到結果1;再根據結果1,執行邏輯2,得到結果2,……依次執行,最後得到結果N,也就是最終結果。

 

    就是這個流程,寫在了一個主方法中,從邏輯1至邏輯N,依次執行。都封裝在一個方法裏,對於主類,其職責不單一;其次,改動也會影響主類,代碼體驗相當不好。其實解決耦合度的難點在於執行邏輯2是依賴或者不依賴邏輯1的執行結果的,而且從邏輯1到邏輯N,會在其中的某個邏輯返回結果。

 

    責任鏈模式剛好能夠解決這個場景。啓發來源於struts2/webwork的Interceptor:就struts2的Action的職責層面而言,需要在Action這個層面上完成的職責很多,因此通過Interceptor將職責進行合理的分類和排序,將他們組織成有序的執行隊列。struts2中使用了一種類似責任鏈的設計模式對這些不同的職責進行分類並串聯起來,從而使得Action層具備了豐富的層次結構。而在這個執行隊列中的每個元素,就被我們稱之爲Interceptor,也就是攔截器。 

 

    而具體到這個軟件產品中,將具體要執行的邏輯1,邏輯2,……邏輯n視爲command,用一個命令鏈給它們穿起來。但是還需要提供每一個command執行之後的上下文context。而上述需求,適用org.apache.commons.chain,就能夠完全實現。

 

    主類如下:

 

命令鏈Tx102010Chain將各種command加載到鏈中:

 

具體命令執行的業務邏輯舉例如下:

 

責任鏈模式,只是一根繩子,它不能夠處理並行的請求。

 

責任鏈模式教學代碼如下:

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章