1.責(zé)任鏈模式介紹
? ? ? ? 責(zé)任鏈模式(Responsibility Pattern)址儒,是十一大行為型設(shè)計模式之一楼眷。
2.責(zé)任模式定義
? ? ? ? 使多個對象都有機會處理請求敞葛,從而避免了請求的發(fā)送者和接收者之間的耦合關(guān)系坏逢。將這些對象連成一條鏈淤袜,并沿著這條鏈傳遞該請求毒租,直到有對象處理它為止稚铣。
3.責(zé)任鏈模式的使用場景
? ? ? ? 多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態(tài)決定墅垮。
? ? ? ? 在請求處理者不明確的情況下向多個對象中的一個提交一個請求惕医。
? ? ? ? 需要動態(tài)指定一組對象處理請求。
4.UML類圖
5.角色介紹
? ? ? ? 1.AbstractHandler:抽象處理者角色噩斟,聲明一個請求處理的方法曹锨,并在其中保持一個對下一個處理節(jié)點Hanler對象的引用。
? ? ? ? 2.ConcreteHandler:具體處理者角色剃允,對請求進行處理沛简,如果不能處理則將該請求轉(zhuǎn)發(fā)給下一個節(jié)點上的處理對象。
? ? ? ? 3.AbstractRequest:抽象請求者斥废。
? ? ? ? 4.ConcreteRequest:具體請求者椒楣。
6.例子
例子分析
? ? ? ? 先聲明一個抽象處理者和一個抽象請求者。抽象處理者里引用一個請求處理的方法,同時保持一個對下一個處理節(jié)點Handler對象的引用毛俏,再寫一個抽象處理方法并在實現(xiàn)類中實現(xiàn)該方法炭庙,同時也還有一個處理級別。抽象請求者里有一個需要處理的內(nèi)容煌寇,也還有一個請求級別焕蹄。
? ? ? ? 在客戶端使用的時候,幾個具體處理者阀溶,需要給予下一個處理節(jié)點是誰腻脏,比如handler1.nextHandler = handler2;將處理者之間串聯(lián)起來成一條鏈,然后處理者處理請求银锻,并根據(jù)處理級別和請求級別進行是否處理以及轉(zhuǎn)發(fā)的判斷永品。
7.Android源碼中的責(zé)任鏈模式
? ? ? ? Android源碼里責(zé)任鏈模式的類似體現(xiàn)莫過于對事件的分發(fā)處理,每當(dāng)用戶接觸屏幕時击纬,Android都會將對應(yīng)的事件包裝成一個事件對象從ViewTree的頂部至上而下地分發(fā)傳遞鼎姐。
8.總結(jié)
? ? ? ? 責(zé)任鏈模式最大的優(yōu)點就是可以對請求者和處理者關(guān)系解耦,提高代碼的靈活性掉弛。其最大的缺點就是對鏈中請求處理者的遍歷症见,如果處理者太多那么遍歷必定會影響性能,特別是在一些遞歸調(diào)用中需要慎重殃饿。
PS:讀《Android源碼設(shè)計模式解析與實戰(zhàn)》中的責(zé)任鏈模式之后的一些筆記與感悟谋作。