定義
使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。責任鏈模式屬于行為型設計模式之一。
使用場景
(1)多個對象可以處理同一請求,但具體由哪個對象處理則在運行時動態(tài)決定。
(2)在請求處理者不明確的情況下向多個對象中的一個提交一個請求。
(3)需要動態(tài)指定一組對象處理請求。
UML類圖
簡化模式:

通用模式:

關(guān)鍵點
(1)請求的發(fā)起可以從責任鏈的任何一個節(jié)點開始。
(2)責任鏈中的任意一個處理者對象都只有兩個行為,一是處理請求,二是將請求轉(zhuǎn)送給下一個節(jié)點。
(3)處理者處理請求后不允許轉(zhuǎn)送到其他節(jié)點進行處理。
(4)純的責任鏈指請求被責任鏈中某個處理對象處理的責任鏈,不純的責任鏈指所有處理者對象都沒處理請求的責任鏈。
實現(xiàn)方式
簡化模式
Handler基類:
public abstract class Handler{
? ? protected Handler successor;
? ? public abstract void handleRequest(string condition);
}
Handler子類1:
public Handler1 extends Handler{
? ? @Override
? ? public void handleRequest(String condition){
? ? ? ? if (null != condition && condition.equals("condition1")){
? ? ? ? ? ? return;
? ? ? ? } else {
? ? ? ? ? ? successor.handleRequest(condition);
? ? ? ? }
? ? }
}
Handler子類2:
public Handler2 extends Handler{
? ? @Override
? ? public void handleRequest(String condition){
? ? ? ? if (null != condition && condition.equals("condition2")){
? ? ? ? ? ? return;
? ? ? ? }else {
? ? ? ? ? ? successor.handleRequest(condition);
? ? ? ? }
? ? }
}
調(diào)用例子
public class Test{
? ? public static void main(string [] args){
? ? ? ? Handler1 mHandler1 = new Handler1();
? ? ? ? Handler2 mHandler2 = new Handler2();
? ? ? ? mHandler1.successor= mHandler2;
? ? ? ? mHandler2.successor= mHandler1;
? ? ? ? mHandler2.handleRequest("condition2");
? ? }
}
通用模式
在簡化模式的基礎上:
(1)Handler子類中添加一個獲取處理請求類型(通常表現(xiàn)為權(quán)限等級)的方法
(2)對請求進行封裝,形成抽象類Request以及其對應子類,每個類中含處理體及其getter、setter方法,以及獲取請求類型(通常表現(xiàn)為權(quán)限等級)的方法
即可構(gòu)成通用模式的責任鏈模式模型代碼。
責任鏈模式的優(yōu)缺點
優(yōu)點
>請求者和處理者解耦,代碼靈活性得到提高
缺點
>請求鏈中對處理者遍歷可能太長,特別是遞歸調(diào)用,會影響性能
Android中的責任鏈模型舉例
ViewTree自上而下分發(fā)事件的機制,即View的事件分發(fā)模型
——2017.08.14