定義:
- 使多個對象都有機會處理請求,從而避免了請求的發送者和接收者之間的耦合關系。將這些對象形成一條鏈,并沿著這條鏈傳遞該請求,直到有對象處理它為止。
通用類圖:
責任鏈模式通用類圖
/*
* 定義抽象的處理類
* */
public abstract class Handler {
// 根據當前設置的相關等級做出對應的處理
private Handler nextHandler;
final Response handleMessage(Request request) {
Response response = null;
// 指定不同的判斷條件
if (request.getLevel().equals(this.getHandlerLevel())) {
response = this.echo(request);
} else {
if (nextHandler != null) {
response = this.nextHandler.handleMessage(request);
} else {
}
}
return response;
}
public void setNextHandler(Handler handler) {
this.nextHandler = handler;
}
// 抽象出獲取等級和處理相應的方法
abstract Level getHandlerLevel();
abstract Response echo(Request request);
}
/*
* 定義請求類
* */
public class Request {
Level getLevel() {
return null;
}
}
public class Response {
// 返回的相應數據
}
/*
* 定義一個請求和處理等級
* */
public class Level {
}
public class HandlerOne extends Handler {
@Override
Level getHandlerLevel() {
// TODO Auto-generated method stub
return null;
}
@Override
Response echo(Request request) {
// TODO Auto-generated method stub
return null;
}
}
public class HandlerThree extends Handler {
@Override
Level getHandlerLevel() {
// TODO Auto-generated method stub
return null;
}
@Override
Response echo(Request request) {
// TODO Auto-generated method stub
return null;
}
}
public class HandlerTwo extends Handler {
@Override
Level getHandlerLevel() {
// TODO Auto-generated method stub
return null;
}
@Override
Response echo(Request request) {
// TODO Auto-generated method stub
return null;
}
}
public class Client {
public static void main(String[] args) {
// 創建所有可能的處理節點
HandlerOne handlerOne = new HandlerOne();
HandlerTwo handlerTwo = new HandlerTwo();
HandlerThree handlerThree = new HandlerThree();
// 設置責任連的執行順序
handlerOne.setNextHandler(handlerTwo);
handlerTwo.setNextHandler(handlerThree);
Response response = handlerOne.handleMessage(new Request());
}
}
優點:
- 將請求和處理分開,解除耦合提高系統的靈活性
缺點:
- 性能問題
- 調試不便,特別是責任連較長、環節較多,由于采用了類似遞歸的方法,調試邏輯較復雜。
注意事項:
- 需要控制鏈中節點的數量,避免出現超長鏈的情況,通常的做法是Handler中設置最大的節點數量,在setNext方法中判斷是否已經超過閾值,避免降低系統性能。