《從Servlet、Dubbo、Mybatis聊聊責任鏈究竟怎麼用 》

責任鏈模式的定義:使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係, 將這個對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有一個對象處理他爲止。這裏就再也不過多的介紹什麼是責任鏈模式,主要來講說java中如何編寫。主要從下面3個框架中的代碼中介紹。

servlet中的filter

dubbo中的filter

mybatis中的plugin

servlet中的Filterjava

servlet中分別定義了一個 Filter和FilterChain的接口,核心代碼以下:數據結構


代碼還算簡單,結構也比較清晰,定義一個Chain,裏面包含了Filter列表和servlet,達到在調用真正servlet以前進行各類filter邏輯。mybatis




Dubbo中的Filter框架

Dubbo在建立Filter的時候是另一個方法,經過把Filter封裝成 Invoker的匿名類,經過鏈表這樣的數據結構來完成責任鏈,核心代碼以下:3d


Dubbo的責任鏈就沒有相似FilterChain這樣的類吧Filter和調用Invoker結合起來,而是經過建立一個鏈表,調用的時候咱們只知道第一個節點,每一個節點包含了下一個調用的節點信息。 這裏的雖然Invoker封裝Filter沒有顯示的指定next,可是經過java匿名類和final的機制達到一樣的效果。代理




Mybatis中的Plugincdn

Mybatis能夠配置各類Plugin,不管是官方提供的仍是本身定義的,Plugin和Filter相似,就在執行Sql語句的時候作一些操做。Mybatis的責任鏈則是經過動態代理的方式,使用Plugin代理實際的Executor類。(這裏實際還使用了組合模式,由於Plugin能夠嵌套代理),核心代碼以下:對象


簡單的示意圖以下:blog


總結接口

這裏簡單介紹了Servlet、Dubbo、Mybatis對責任鏈模式的不一樣實現手段,其中Servlet是相對比較清晰,又易於實現的方式,而Dubbo和Mybatis則適合在原有代碼基礎上,增長責任鏈模式代碼改動量最小的。https://dwz.cn/1TtgW7Ud

相關文章
相關標籤/搜索