當客戶端發出一個請求,有多個對象都有機會來處理這個請求,但是客戶端不知道究竟誰會來處理他的請求時,這是就可以使用責任鏈模式來處理這種情況。
1、定義
使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止。
2、使用場景
- 多個對象可以處理一個請求,但具體由哪個對象處理則在運行時動態決定。
- 在請求者不明確的情況下向多個對象中的一個提交一個請求。
- 需要動態指定一組對象處理請求。
3、UML圖
4、示例代碼
public abstract class Handler {
/**
* 持有後繼的責任對象
*/
protected Handler successor;
/**
* 示意處理請求的方法,雖然這個示意方法是沒有傳入參數的
* 但實際是可以傳入參數的,根據具體需要來選擇是否傳遞參數
*/
public abstract void handleRequest();
/**
* 設置後繼的責任對象
*/
public void setSuccessor(Handler successor) {
this.successor = successor;
}
}
public class ConcreteHandler1 extends Handler {
/**
* 處理方法,調用此方法處理請求
*/
@Override
public void handleRequest() {
/**
* 根據某些條件來判斷是否屬於自己處理的職責範圍
*/
boolean condition = false;
if (condition) {
System.out.println("ConcreteHandler1 處理請求");
} else {
if(successor != null) {
System.out.println("ConcreteHandler1 處理不了,交給下個 handler 處理請求");
successor.handleRequest();
}
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest() {
/**
* 根據某些條件來判斷是否屬於自己處理的職責範圍
*/
boolean condition = true;
if (condition) {
System.out.println("ConcreteHandler2 處理請求");
} else {
if(successor != null) {
System.out.println("交給下個 handler 處理請求");
successor.handleRequest();
}
}
}
}
客戶端調用:
public class Client {
public static void main(String args[]) {
// 組裝責任鏈
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setSuccessor(handler2);
// 提交請求
handler1.handleRequest();
}
}
結果輸出:
責任鏈模式的本質是分離職責,動態組合。