1.責(zé)任鏈模式概述
????所謂的責(zé)任鏈就是你本身是否有能力去處理這件事,沒(méi)辦法處理的話就會(huì)傳遞給比你則為高或者更厲害的人處理。舉個(gè)例子: 如加工雞爪工廠窃躲,采購(gòu)員去采購(gòu)原生雞爪,采購(gòu)量小的話可以直接采購(gòu)钦睡,采購(gòu)量大的話就要交給采購(gòu)經(jīng)理審批框舔,審批通過(guò)才可進(jìn)行采購(gòu),以此類(lèi)推赎婚。
2.責(zé)任鏈模式的實(shí)現(xiàn)
????首先我們以采購(gòu)雞爪為實(shí)例刘绣,對(duì)其進(jìn)行UML圖設(shè)計(jì),如下所示:
我們通過(guò)UML圖來(lái)進(jìn)行創(chuàng)建代碼并分析挣输,我們定義了一個(gè)雞爪的實(shí)體類(lèi)count字段代表要采購(gòu)的雞爪總數(shù)纬凤,這里只是為了測(cè)試不做過(guò)多的聲明代碼如下:
接著是責(zé)任鏈的重點(diǎn),我們抽象出了一個(gè)職位的抽象類(lèi),該類(lèi)有職位名稱(chēng)撩嚼,以及要傳遞給下一個(gè)的職位停士。一個(gè)抽象的方法requestRedirect表示當(dāng)前職位是否能處理該采購(gòu)單挖帘,不能的話就會(huì)傳遞給下一個(gè)高職位的人。我們來(lái)看一看我們抽象類(lèi)以及對(duì)應(yīng)實(shí)體類(lèi)所編寫(xiě)的示例代碼更方便理解恋技。
我們處理了三種不同職責(zé)的職位拇舀,采購(gòu)員只能采購(gòu)500個(gè)以下,高出的會(huì)交予采購(gòu)經(jīng)理蜻底,采購(gòu)經(jīng)理只能處理5000一下的骄崩,再高的會(huì)交予CEO進(jìn)行處理。
????客戶(hù)端進(jìn)行創(chuàng)建的時(shí)候薄辅,會(huì)創(chuàng)建出三種職位要拂,以及對(duì)其進(jìn)行鏈?zhǔn)揭谩N覀儎?chuàng)建不同采購(gòu)雞爪的數(shù)量都交給采購(gòu)員站楚。采購(gòu)員便會(huì)根據(jù)職責(zé)進(jìn)行一層層的傳遞下去代碼如下:
3.責(zé)任鏈總結(jié)(引用:http://cmsblogs.com/?p=5006)
1.主要優(yōu)點(diǎn)
職責(zé)鏈模式的主要優(yōu)點(diǎn)如下:
(1) 職責(zé)鏈模式使得一個(gè)對(duì)象無(wú)須知道是其他哪一個(gè)對(duì)象處理其請(qǐng)求脱惰,對(duì)象僅需知道該請(qǐng)求會(huì)被處理即可,接收者和發(fā)送者都沒(méi)有對(duì)方的明確信息窿春,且鏈中的對(duì)象不需要知道鏈的結(jié)構(gòu)拉一,由客戶(hù)端負(fù)責(zé)鏈的創(chuàng)建,降低了系統(tǒng)的耦合度旧乞。
(2) 請(qǐng)求處理對(duì)象僅需維持一個(gè)指向其后繼者的引用舅踪,而不需要維持它對(duì)所有的候選處理者的引用,可簡(jiǎn)化對(duì)象的相互連接良蛮。
(3) 在給對(duì)象分派職責(zé)時(shí)抽碌,職責(zé)鏈可以給我們更多的靈活性,可以通過(guò)在運(yùn)行時(shí)對(duì)該鏈進(jìn)行動(dòng)態(tài)的增加或修改來(lái)增加或改變處理一個(gè)請(qǐng)求的職責(zé)决瞳。
(4) 在系統(tǒng)中增加一個(gè)新的具體請(qǐng)求處理者時(shí)無(wú)須修改原有系統(tǒng)的代碼货徙,只需要在客戶(hù)端重新建鏈即可,從這一點(diǎn)來(lái)看是符合“開(kāi)閉原則”的皮胡。
2.主要缺點(diǎn)
職責(zé)鏈模式的主要缺點(diǎn)如下:
(1) 由于一個(gè)請(qǐng)求沒(méi)有明確的接收者痴颊,那么就不能保證它一定會(huì)被處理,該請(qǐng)求可能一直到鏈的末端都得不到處理屡贺;一個(gè)請(qǐng)求也可能因職責(zé)鏈沒(méi)有被正確配置而得不到處理蠢棱。
(2) 對(duì)于比較長(zhǎng)的職責(zé)鏈,請(qǐng)求的處理可能涉及到多個(gè)處理對(duì)象甩栈,系統(tǒng)性能將受到一定影響泻仙,而且在進(jìn)行代碼調(diào)試時(shí)不太方便。
(3) 如果建鏈不當(dāng)量没,可能會(huì)造成循環(huán)調(diào)用玉转,將導(dǎo)致系統(tǒng)陷入死循環(huán)。
3.適用場(chǎng)景
在以下情況下可以考慮使用職責(zé)鏈模式:
(1) 有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求殴蹄,具體哪個(gè)對(duì)象處理該請(qǐng)求待運(yùn)行時(shí)刻再確定究抓,客戶(hù)端只需將請(qǐng)求提交到鏈上猾担,而無(wú)須關(guān)心請(qǐng)求的處理對(duì)象是誰(shuí)以及它是如何處理的。
(2) 在不明確指定接收者的情況下刺下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求绑嘹。
(3) 可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求,客戶(hù)端可以動(dòng)態(tài)創(chuàng)建職責(zé)鏈來(lái)處理請(qǐng)求橘茉,還可以改變鏈中處理者之間的先后次序工腋。