讓我們?cè)賮?lái)回顧一下之前我們?cè)?jīng)用過(guò)的一張Action LifeCycle的圖:
圖中,我們可以發(fā)現(xiàn),Struts2的Interceptor一層一層,把Action包裹在最里面。這樣的結(jié)構(gòu),大概有以下一些特點(diǎn):
1. 整個(gè)結(jié)構(gòu)就如同一個(gè)堆棧,除了Action以外,堆棧中的其他元素是Interceptor
2. Action位于堆棧的底部。由于堆棧"先進(jìn)后出"的特性,如果我們?cè)噲D把Action拿出來(lái)執(zhí)行,我們必須首先把位于Action上端的Interceptor拿出來(lái)執(zhí)行。這樣,整個(gè)執(zhí)行就形成了一個(gè)遞歸調(diào)用
3. 每個(gè)位于堆棧中的Interceptor,除了需要完成它自身的邏輯,還需要完成一個(gè)特殊的執(zhí)行職責(zé)。這個(gè)執(zhí)行職責(zé)有3種選擇:
1) 中止整個(gè)執(zhí)行,直接返回一個(gè)字符串作為resultCode
2) 通過(guò)遞歸調(diào)用負(fù)責(zé)調(diào)用堆棧中下一個(gè)Interceptor的執(zhí)行
3) 如果在堆棧內(nèi)已經(jīng)不存在任何的Interceptor,調(diào)用Action
Struts2的攔截器結(jié)構(gòu)的設(shè)計(jì),實(shí)際上是一個(gè)典型的
責(zé)任鏈模式
的應(yīng)用。首先將整個(gè)執(zhí)行劃分成若干相同類(lèi)型的元素,每個(gè)元素具備不同的邏輯責(zé)任,并將他們納入到一個(gè)鏈?zhǔn)降臄?shù)據(jù)結(jié)構(gòu)中(我們可以把堆棧結(jié)構(gòu)也看作是一個(gè)遞歸的鏈?zhǔn)浇Y(jié)構(gòu)),而每個(gè)元素又有責(zé)任負(fù)責(zé)鏈?zhǔn)浇Y(jié)構(gòu)中下一個(gè)元素的執(zhí)行調(diào)用。
這樣的設(shè)計(jì),從代碼重構(gòu)的角度來(lái)看,實(shí)際上是將一個(gè)復(fù)雜的系統(tǒng),分而治之,從而使得每個(gè)部分的邏輯能夠高度重用并具備高度可擴(kuò)展性。所以,Interceptor結(jié)構(gòu)實(shí)在是Struts2/Xwork設(shè)計(jì)中的精華之筆。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
