就像鏈條一環扣一環一樣,責任鏈模式就是責任鏈對象之間相互關聯,讓消息在他們之間傳遞。消息從鏈首發出,沿著鏈條傳播,直到有對象處理為止。
定義:
使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止
使用場景:
多個對象可以處理一個請求,但是具體哪個對象來處理需要在運行時才知道。
請求的對象不明確的情況下,可像任意一個對象提交請求。
在運行時需要動態指定一組對象中的一個來處理。
實例:
你上周去上海出差,花了50萬,回來要報銷,找到了小組長,小組長一看,臥艸,這個金額我批不了。 于是小組長去找到了部門主管,主管一看,這數額也超出我的管轄范圍了。主管又去找到了經理,經理說「我只能報批5萬以下的金額」,于是經理找到了老板。老板看后說,好了你明天不用來上班了。
讓我們來看看怎么實現。
首先有一個責任鏈基類 Leader
里面有兩個抽象方法,getLimit用來獲取具體實現類能處理的最大金額。handle(int money)方法,里面由子類實現如果要處理數據具體的做法。
還有一個handleRequest方法,使用來實現責任鏈傳遞的。
有一個成員變量 Leader nextHandler,用來保存高一級的領導處理者
//handleRequest責任鏈傳遞方法的實現
public final void handleRequest(int money){
? ? if(money<getLimit()){
? ? ?handle(money);
? ? }else{
? ? ? if(null != nextHandler){
? ? ? ? ? ?nextHandler.handlerRequest(money);
? ? ? }
? ? }
}
也就是在具體實現類中,要是能處理就調用自己本身的handler方法處理,如果處理不了,就調用下一個對象來處理。
Android源碼中的責任鏈模式實現:
大家再熟悉不過了,Android中觸摸事件的時間分發處理機制,其實就是責任鏈模式。
ViewGroup時間投遞的遞歸調用就是一條責任鏈,找到責任者就消費掉此事件,具體體現在View中的onTouchEvent方法中返回值的設置,如果返回false則繼續傳遞,如果返回true,就消費此事件并且不向外傳遞。
實戰
比如我們可以使用有序廣播來處理一個廣播事件,原理很簡單,這里就不寫代碼了,就是Acitivity中發送一個有序廣播,里面有兩個信息,limit和msg,limit是定義廣播處理的匹配權限,比如1000,100,10,msg是廣播攜帶的信息。
然后有三個具體實現的廣播,通過limit來匹配,如果符合就自己處理,否則就發送給下一個廣播。
優點:對請求者和處理這的關系解耦,提高靈活性。
缺點:請求鏈中的處理者著遍歷,影響性能,特別是在一些遞歸調用中。