1. 程式人生 > >責任鏈模式的應用例項

責任鏈模式的應用例項

    對於一般的程式設計師而言,在平時的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載入到鏈中:

 

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

 

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

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