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

學(xué)而時(shí)習(xí)之熙涤,溫故而知新惋砂。這句話用在設(shè)計(jì)模式上真是太恰當(dāng)不過了!博主從上大二的時(shí)候就開始閱讀設(shè)計(jì)模式厢洞,當(dāng)時(shí)對(duì)面向?qū)ο蟮乃季S理解的不是很深刻仇让。所以一些設(shè)計(jì)模式弄得一知半解,只知其形而不知其神犀变。工作之余也沒有放棄過對(duì)設(shè)計(jì)模式的學(xué)習(xí)和琢磨妹孙,每次閱讀相關(guān)的設(shè)計(jì)模式總有不同的心得體會(huì)秋柄。收貨頗多获枝。所以在此建議讀者也要時(shí)不時(shí)翻看下設(shè)計(jì)模式。從中演化出適合自己的模式出來骇笔∈〉辏可以說設(shè)計(jì)模式是面向?qū)ο笏季S的集大成者嚣崭。越閱讀越有味道。

閑言少敘懦傍,本篇博文就簡(jiǎn)單的梳理下博主對(duì)責(zé)任鏈模式的理解和體會(huì)雹舀,如有不當(dāng)之處歡迎批評(píng)指正。正規(guī)的責(zé)任鏈模式有如下兩點(diǎn):
1粗俱、責(zé)任鏈一般有兩種對(duì)象说榆,一個(gè)是請(qǐng)求者。一個(gè)是處理者寸认。需要注意的是<font color="#ff00ff">處理者是有可能返回處理結(jié)果給請(qǐng)求者的</font>签财。查閱了好多篇關(guān)于責(zé)任鏈模式的文章,這點(diǎn)好像都沒有提及偏塞。
2唱蒸、多個(gè)對(duì)象中,每個(gè)對(duì)象都持有下一個(gè)對(duì)象的引用灸叼,這就構(gòu)成了鏈這種結(jié)構(gòu)神汹。(但是一定要如此嗎?后面會(huì)有說明)

因?yàn)樵诖a設(shè)計(jì)中我們會(huì)將處理者抽象出一個(gè)接口古今,所以實(shí)現(xiàn)這個(gè)接口的處理者可能屁魏。


在這里插入圖片描述

責(zé)任鏈模式的主要工作就是在眾多的處理者中找到能處理當(dāng)前請(qǐng)求的那一個(gè)處理者對(duì)象!所以具體的處理者需要持有下一個(gè)處理者的引用沧卢!ConcreteHandler1 偽代碼如下:

public class ConcreteHandler1 extends Handler{
        protected Handler nextHandler;//下一個(gè)處理者
        @Override
        public void handleRequest() {
            if ( 符合處理要求) {
               //進(jìn)行處理  邏輯
                 doMyJob();
            } else {//不符合則交給下一個(gè)處理者
                nextHandler.handleRequest();
            }
        }
    }

責(zé)任鏈模式的一個(gè)特點(diǎn)就是<font color="#ff00ff">當(dāng)前處理者必須知道下一個(gè)處理者是誰(shuí)</font>蚁堤。初始化當(dāng)前處理者的時(shí)候也要把下一個(gè)處理者進(jìn)行綁定。其實(shí)如果當(dāng)前處理者不需要知道下一個(gè)處理者是誰(shuí)的話但狭,完全可以這么調(diào)用:

List<Handler> handlers=initHandlers();
for(Handler currentHandler:handlers){
   if(currentHandler.isHandlebale()){//如果當(dāng)前能夠處理當(dāng)前請(qǐng)求
     currentHandler.handleRequest();
     break;//處理完畢披诗,跳出循環(huán)
   }
}

上面這個(gè)for循環(huán)的責(zé)任鏈模式甚至可以說是ConcreteHandler1 代碼的擴(kuò)展,因?yàn)樗容^靈活立磁!ConcreteHandler1 在設(shè)計(jì)的時(shí)候需要指定下一個(gè)處理者呈队。而for循環(huán)遍歷的這種方式,我們只需要在initHandlers()初始化處理者集合的時(shí)候唱歧,合理的安排好集合中的順序即可將這種擊鼓傳花的游戲玩下去宪摧。

考慮到另外一個(gè)場(chǎng)景:公司的請(qǐng)假系統(tǒng),需要層層批準(zhǔn),上一個(gè)部分批準(zhǔn)后需要把后續(xù)流程交個(gè)下一個(gè)部門颅崩,這種工作模式最適合責(zé)任鏈模式几于。但是如果需要層層批準(zhǔn)的話,那么上面的偽代碼ConcreteHandler1 就不符合沿后,因?yàn)樗幚硗陮儆谧约旱墓ぷ骱缶筒煌髠髁搜嘏恚跃托枰M(jìn)行如下改造:

public class ConcreteHandler1 extends Handler{
        protected Handler nextHandler;//下一個(gè)處理者
        @Override
        public void handleRequest() {
             //處理屬于我自己分內(nèi)的邏輯
             doMyJob();
            //處理完成后,后續(xù)流程交給下一個(gè)處理者
             nextHandler.handleRequest();
           
        }
    }

在平時(shí)寫代碼中尖滚,其實(shí)自己很少用過這種設(shè)計(jì)模式喉刘。但是有一個(gè)框架把這個(gè)模式用的很出彩瞧柔,那就是Okhttp框架。其攔截器的設(shè)計(jì)理念堪稱責(zé)任鏈模式的靈活使用的典范睦裳,關(guān)于Okhttp框架的分析可參考博主的專欄okhttp源碼解析造锅。

在OKhttp的攔截器中,發(fā)起一個(gè)網(wǎng)絡(luò)請(qǐng)求廉邑,我們將請(qǐng)求封裝成Request對(duì)象哥蔚。交給攔截器中的某個(gè)攔截器,該攔截器處理完自己的工作之后蛛蒙,根據(jù)具體業(yè)務(wù)邏輯判斷是否需要交給下一個(gè)攔截器肺素。如果不需要,就將處理結(jié)果Response對(duì)象返回給請(qǐng)求者宇驾!其流程圖如下圖所示:


在這里插入圖片描述

到此為止倍靡,關(guān)于責(zé)任鏈模式的心得體會(huì)書寫完畢。后期可能隨著自己體會(huì)的不斷加深课舍,該篇博文需要進(jìn)行修改塌西,敬請(qǐng)期待吧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筝尾,一起剝皮案震驚了整個(gè)濱河市捡需,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筹淫,老刑警劉巖站辉,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異损姜,居然都是意外死亡饰剥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門摧阅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來汰蓉,“玉大人,你說我怎么就攤上這事棒卷」四酰” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵比规,是天一觀的道長(zhǎng)若厚。 經(jīng)常有香客問我,道長(zhǎng)蜒什,這世上最難降的妖魔是什么测秸? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上乞封,老公的妹妹穿的比我還像新娘。我一直安慰自己岗憋,他們只是感情好肃晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仔戈,像睡著了一般关串。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上监徘,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天晋修,我揣著相機(jī)與錄音,去河邊找鬼凰盔。 笑死墓卦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的户敬。 我是一名探鬼主播落剪,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼尿庐!你這毒婦竟也來了忠怖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抄瑟,失蹤者是張志新(化名)和其女友劉穎凡泣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮假,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鞋拟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惹资。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片严卖。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖布轿,靈堂內(nèi)的尸體忽然破棺而出哮笆,到底是詐尸還是另有隱情,我是刑警寧澤汰扭,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布稠肘,位于F島的核電站,受9級(jí)特大地震影響萝毛,放射性物質(zhì)發(fā)生泄漏项阴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望环揽。 院中可真熱鬧略荡,春花似錦、人聲如沸歉胶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)通今。三九已至粥谬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辫塌,已是汗流浹背漏策。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留臼氨,地道東北人掺喻。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像储矩,于是被迫代替她去往敵國(guó)和親巢寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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