本文是對設計模式之禪一書中責任鏈模式一章的總結與整理。
1.定義
啥叫責任鏈呢?意思就是鏈上的每一個節點都有責任去判斷是不是自己的責任,如果是自己的責任就處理這件事情,不是就傳遞到下一個節點,夠簡單吧。書中給出的定義如下:使多個對象都有機會處理請求,從而避免了請求的發送和接收者之間的耦合關系。將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。,其通用類圖如下:
類圖.png
2. 解析
大過年的,每個人都想回家,假設你的老家是廣州,現在要坐001次車從北京回家,這輛車要經過的站假設有以下的一些:北京-》上海-》廣州。先定義父類:
public abstract class Station {
// 下一個要處理的是誰
private Station nextStation;
//具體要做什么(責任鏈上的某一節點具體要做的事情)
public abstract void execute();
// 獲取當前責任鏈上該節點的目的地
public abstract String getMyDestination();
public void setNextStation(Station _station){
this.nextStation=_station;
}
//處理用戶請求
//userDestination為用戶的目的的
public void handleStation(String userDestination){
//判斷用戶的目的地是否當前目的地一致,一致則處理,不一定則獲取下一個目的地
if(userDestination.equals(this.getMyDestination())){
this.execute();
}
else if(null!=this.nextStation){ //不一致則由下一個目的地(節點)處理
this.nextStation.handleStation(userDestination);
}
else{ //如果下一站為空,則結束
System.out.println("您應該到家了吧,責任鏈到頭了");
}
}
}
這個類比較簡單,有幾點需要注意下:
需要定義“下一個”變量(體現出鏈的味道)
-
需要定義處理請求的方法:
2.1 定義依次處理請求的方法,這里指的是handleStation (它負責判斷是否為當前節點,是則調用相應的方法,不是則進入下一個節點)
2.2 定義方法,指定下一個節點是誰
2.3 定義抽象方法,由子類實現具體的處理工作
再看子類,北京站:
public class Beijing extends Station {
@Override
public void execute() {
System.out.println("您已到達北京站");
}
@Override
public String getMyDestination() {
return "北京";
}
}
上海站:
public class ShangHai extends Station {
@Override
public void execute() {
System.out.println("您已到達上海站");
}
@Override
public String getMyDestination() {
return "上海";
}
}
廣州站:
public class GuangZhou extends Station {
@Override
public void execute() {
System.out.println("您已到達廣州站");
}
@Override
public String getMyDestination() {
return "廣州";
}
}
再看現實中的你:
public class Client {
public static void main(String[] strings){
//定義責任鏈上的節點
Beijing beijing=new Beijing();
ShangHai shanghai=new ShangHai();
GuangZhou guangZhou=new GuangZhou();
//設定節點順序
beijing.setNextStation(shanghai);
shanghai.setNextStation(guangZhou);
//責任鏈從頭處理
beijing.handleStation("廣州");
}
}
運行后結果正常輸出,符合我們的預期。
3.總結
我認為責任鏈還是很簡單的一個模式,如果要使用它,我們只需要做幾個事情就可以:
1. 定義鏈上的節點
2. 定義節點之間的順序
4.擴展
在以上的示例中,父類里判斷是不是當前節點,不是當間節點就進入下一個節點,在此處我們可以做一些擴展,比如:如果當前節點不是目的節點,則做一些什么樣的操作,比如送個飯之類的。
還可以做的擴展比如:不判斷比較當前節點是不是目的節點,只要不是目的節點就做什么事情,比如到每個站,我去一次WC,是吧。
切記:鏈、、、、、、鏈、、、、、、鏈、、、、、、,務請把鏈的概念搞明白,抓到這個本質。