定義
職責(zé)鏈模式(Chain of Responsibility Pattern):避免請求發(fā)送者與接收者耦合在一起也搓,讓多個(gè)對象都有可能接收請求舍哄,將這些對象連接成一條鏈,并且沿著這條鏈傳遞請求潮模,直到有對象處理它為止罢绽。職責(zé)鏈模式是一種對象行為型模式。
代碼演示
class Requset{
}
class Handler1 implements Handler{
private Handler mHandler;
public Handler1(Handler handler){
this.mHandler = handler;
}
@Override
public void handle(Requset requset) {
if (needHandle){
Log.e(TAG, "handle1");
}else {
mHandler.handle(requset);
}
}
}
class Handler2 implements Handler{
private Handler mHandler;
public Handler2(Handler handler){
this.mHandler = handler;
}
@Override
public void handle(Requset requset) {
if (needHandle){
Log.e(TAG, "handle2");
}else {
mHandler.handle(requset);
}
}
}
class Handler3 implements Handler{
@Override
public void handle(Requset requset) {
Log.e(TAG, "handle3");
}
}
public void handle(){
Handler handler3 = new Handler3();
Handler handler2 = new Handler2(handler3);
Handler handler1 = new Handler1(handler2);
handler1.handle(new Requset());
}
handler1 持有handler2味榛,handler2 又持有handler3椭坚。Request是具體處理時(shí)需要用到的參數(shù),也可沒有搏色。一旦handler1開始處理藕溅,那么如果條件允許,就會(huì)傳遞給handler2继榆,再傳遞給handler3巾表,就像鏈條一樣。相當(dāng)于把多個(gè)處理邏輯分別放到了不同的handler中略吨,將他們解耦集币。如果需要增加處理邏輯,只需要新建handler的子類翠忠。
實(shí)際運(yùn)用
android的事件分發(fā)就是典型的職責(zé)鏈模式鞠苟。每個(gè)view都是handler,從頂級view開始傳遞秽之,內(nèi)部邏輯判斷后如果需要處理就調(diào)用onTouchEvent当娱,如果不需要處理就傳遞下去。
okhttp把http請求的各個(gè)步驟分別封裝進(jìn)了不同的攔截器考榨。但是他不是標(biāo)準(zhǔn)的職責(zé)鏈模式跨细,每個(gè)攔截器都會(huì)去處理。為了把攔截器串起來河质,他增加了一個(gè)類叫chain冀惭,chain持有了所有的攔截器和下一個(gè)需要執(zhí)行的攔截器索引震叙,并調(diào)用intecept方法把處理傳遞下去。
職責(zé)鏈模式把不同的處理邏輯封裝到不同的類中散休,并把是否處理的邏輯也分發(fā)到具體類中媒楼。特別需要注意,他是按照既定的順序執(zhí)行下來的戚丸,所以特別適合需要按照順序通過判斷進(jìn)行處理的情況划址。