設(shè)計模式之責(zé)任鏈模式

設(shè)計模式之責(zé)任鏈模式

前言

之前覺得責(zé)任鏈模式是一種很高大上的模式泥耀,因為它不想策略模式那么隨處可見躺涝,也不想模板模式那么簡單明了疗我,我對責(zé)任鏈模式的了解僅限于一些框架中,如Shiro Filter中或者Dubbo Filter中琐脏,只是概念上的簡單認(rèn)識攒砖。最近項目中有一個需求,剛好有一個常見可以使用責(zé)任鏈模式日裙,所以就實踐了一把吹艇。

簡單說明

責(zé)任鏈模式類似與大家都玩過的游戲“擊鼓傳花”,請求的發(fā)起者就是開始游戲的人昂拂,而玩游戲的人呢則組成了一個處理者鏈受神,當(dāng)喊停的時候,花停留在哪一個人手里格侯,對應(yīng)就是請求被哪一個具體的人處理了鼻听。
請求的發(fā)起者發(fā)出請求,調(diào)用一個處理者联四,其實是一個處理鏈撑碴,而具體請求是被哪一個處理者處理了,請求的發(fā)起者是不知道也不關(guān)心的朝墩;而對于不同的請求醉拓,可能處理鏈也是不一樣的,不同的請求會有不同的處理鏈收苏,在執(zhí)行請求的過程中亿卤,動態(tài)的裝配處理鏈。我個人覺得責(zé)任鏈模式的核心就是責(zé)任鏈的裝配鹿霸。責(zé)任鏈的裝配的工作可以是有請求的調(diào)用者來裝配排吴,根據(jù)請求的信息,從處理者列表中選擇懦鼠、組裝責(zé)任鏈钻哩,我此次就是這么做的(因為相對比較簡單);也可以把這個裝配的工作交由框架來組裝葛闷,這樣職責(zé)更單一憋槐。
這樣就可以將請求的發(fā)起者和請求的具體處理者解耦双藕,根據(jù)請求的信息淑趾,每一次都進(jìn)行處理者的組裝,可以做到在運(yùn)行時動態(tài)組裝責(zé)任鏈 忧陪。

類圖

責(zé)任鏈
責(zé)任鏈

參與角色

  1. Client:調(diào)用者
    客戶端是請求的發(fā)起者扣泊,它負(fù)責(zé)調(diào)用一個AbstractHandler近范,具體請求是被責(zé)任鏈中的哪一個Handler處理了,客戶端是不清楚的延蟹。

  2. AbstractHandler:抽象的執(zhí)行類
    此類負(fù)責(zé)定義抽象的Handler评矩,對外提供一個公共的Handler方法供客戶端調(diào)用

  3. ConcreteHandler:具體的執(zhí)行類
    具體的執(zhí)行類只處理自己感興趣的部分,需要判斷當(dāng)前請求自己能否處理阱飘,如果可以處理斥杜,就自己處理,請求結(jié)束沥匈;如果處理不了蔗喂,就將請求轉(zhuǎn)發(fā)到下一個ConcreteHandler處理,如果沒有下一個Handler高帖,那么請求結(jié)束缰儿。

舉例

以此次項目舉例,代碼就不粘貼了散址。系統(tǒng)要對一個發(fā)票進(jìn)行規(guī)則判斷乖阵,而規(guī)則有很多種,并且不同種類發(fā)票的判斷規(guī)則是由不同規(guī)則組合而成的预麸。當(dāng)系統(tǒng)就收到一個發(fā)票的判斷請求時瞪浸,需要根據(jù)發(fā)票的信息,組裝相應(yīng)的校驗規(guī)則吏祸,如果有一個規(guī)則不滿足默终,那么發(fā)票就判斷為不符合條件的發(fā)票。這里不同的檢驗規(guī)則就是具體的校驗處理者犁罩,每一次發(fā)票過來齐蔽,就可以獲取對應(yīng)的校驗規(guī)則鏈,從而進(jìn)行處理床估。

遇到的一些問題
  1. 日志問題
    由于是鏈?zhǔn)秸{(diào)用含滴,所以責(zé)任鏈模式一旦出現(xiàn)問題,調(diào)試起來相對來說麻煩一點丐巫,所以要在責(zé)任鏈調(diào)用過程中關(guān)鍵地方進(jìn)行日志記錄谈况,記錄執(zhí)行鏈的執(zhí)行記錄。方便出現(xiàn)問題定位問題递胧。
  2. 順序問題
    在裝載責(zé)任鏈的時候碑韵,特別是使用每一個處理者持有下一個處理者引用的時候,一定要注意不要產(chǎn)生循環(huán)引用缎脾,否則就會形成死循環(huán)祝闻。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市遗菠,隨后出現(xiàn)的幾起案子联喘,更是在濱河造成了極大的恐慌华蜒,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件豁遭,死亡現(xiàn)場離奇詭異叭喜,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蓖谢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門捂蕴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闪幽,你說我怎么就攤上這事启绰。” “怎么了沟使?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵委可,是天一觀的道長。 經(jīng)常有香客問我腊嗡,道長着倾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任燕少,我火速辦了婚禮卡者,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘客们。我一直安慰自己崇决,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布底挫。 她就那樣靜靜地躺著恒傻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪建邓。 梳的紋絲不亂的頭發(fā)上盈厘,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天,我揣著相機(jī)與錄音官边,去河邊找鬼沸手。 笑死,一個胖子當(dāng)著我的面吹牛注簿,可吹牛的內(nèi)容都是我干的契吉。 我是一名探鬼主播,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼诡渴,長吁一口氣:“原來是場噩夢啊……” “哼捐晶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤租悄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后恩袱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泣棋,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年畔塔,在試婚紗的時候發(fā)現(xiàn)自己被綠了潭辈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡澈吨,死狀恐怖把敢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谅辣,我是刑警寧澤修赞,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站桑阶,受9級特大地震影響柏副,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚣录,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一割择、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萎河,春花似錦荔泳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擎椰,卻和暖如春沾鳄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背确憨。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工译荞, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人休弃。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓吞歼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塔猾。 傳聞我的和親對象是個殘疾皇子篙骡,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容