八、責任鏈設計模式
1. 責任鏈模式介紹
使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
考慮到如下情景:
小李要出差,出差之後,小李要報銷經費,小李申請了50000塊的經費。
首先向組長提出,組長,他只能報銷2000元以內的。組長把小李的請求向主管提出。
主管收到申請後,主管說他也無法批准,他只能批准5000以內的,所以主管把請求又遞交給了總經理。
總經理收到請求後,他只能批准10000以內的,所以主管把請求又遞交給了老闆。
老闆收到請求後,把小李的請求給處理了。
以上請求就是一個責任鏈模式,發出請求者並不知道誰會來處理請求,每個領導會根據自己的職責範圍,來判斷是處理還是把請求遞交給更高級別的領導。只要有領導處理了,傳遞就結束了。
2. 責任鏈模式使用場景
- 多個物件可以處理同一請求,單具體由哪個物件處理則在執行時動態決定的。
- 在請求矗立著不明確的情況下向多個物件中的一個提交一個請求。
- 需要動態指定一組物件處理請求。
3. 責任鏈模式UML類圖
4. 責任鏈模式簡單實現
情景描述:介紹裡面描述的申請經費案例。
包結構:
(1) 首先宣告一個抽象的老闆類:
public abstract class Leader {
protected Leader nextHandler;//上一級領導處理者
public void handleRequest (int money) {
if (money <= limit()) {
handleMoney(money);
} else {
if (nextHandler != null) {
nextHandler.handleRequest(money);
}
}
}
//處理
protected abstract void handleMoney (int money);
//每一級領導能夠批准的額度
protected abstract int limit();
}
在上述抽象類中,發起請求時,呼叫handleRequest()方法,步驟如下:
在handleRequest方法中,首先判斷傳遞進來的money是否小於當前領導能夠批准的額度。這個額度由 limit()這個方法返回,limit()是一個抽象方法,由具體的領導實現。
如果money小於當前領導所能處理的額度,呼叫handleMoney(money)方法,handleMOney(money)也是一個抽喜類,由具體的領導類實現。
如果money大於當前領導所能處理的額度,呼叫上一級領導的handleReqeust()方法。
重複以上1、2、3步驟,直到結束。
(2)具體的領導類:Boos,DirectorLeader,GroupLeader,ManagerLeader:
public class Boss extends Leader {
@Override
protected void handleMoney(int money) {
System.out.println("老闆報銷: " + money);
}
@Override
protected int limit() {
return Integer.MAX_VALUE;
}
}
(3)測試類:
public class Person {
public static void main(String[] args) {
//構造各個級別領導
GroupLeader groupLeader = new GroupLeader();
DirectorLeader directorLeader = new DirectorLeader();
ManagerLeader managerLeader = new ManagerLeader();
Boss boss = new Boss();
//設定上一級領導處理物件
groupLeader.nextHandler = directorLeader;
directorLeader.nextHandler = managerLeader;
managerLeader.nextHandler = boss;
//申請報銷
groupLeader.handleRequest(50000);
}
}
- 對於責任鏈來說,一個請求最終只有兩種情況:一是被某個處理物件處理,另一個是所有的物件均為對其處理。 對於前一種情況,我們稱該物件為純的責任鏈,對於後一種情況我們稱為不純的責任鏈,在實際應用中,我們所見的責任鏈模式大多為不純的責任鏈模式。
5. 責任鏈模式在Android系統中
android觸控事件流程是一個典型的責任鏈模式,具體網上有很多優質的文章介紹,這裡就不做贅述了。
這裡推薦一篇個人決定不錯的文章。
6. 責任鏈模式在Android開發中
責任鏈模式可以替代各種分支和條件判斷語句,這裡就不做具體舉例。
7. 總結
- 優點:
- 可以對請求者和處理者關係解耦,提高程式碼的靈活性。
- 缺點:
- 對鏈中請求處理的遍歷,如果處理者太多,那麼遍歷必定會影響效能。