定義:
- 使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求秀存,從而避免了請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系羔杨。將這些對(duì)象形成一條鏈性誉,并沿著這條鏈傳遞該請(qǐng)求窿吩,直到有對(duì)象處理它為止。
通用類圖:
責(zé)任鏈模式通用類圖
/*
* 定義抽象的處理類
* */
public abstract class Handler {
// 根據(jù)當(dāng)前設(shè)置的相關(guān)等級(jí)做出對(duì)應(yīng)的處理
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;
}
// 抽象出獲取等級(jí)和處理相應(yīng)的方法
abstract Level getHandlerLevel();
abstract Response echo(Request request);
}
/*
* 定義請(qǐng)求類
* */
public class Request {
Level getLevel() {
return null;
}
}
public class Response {
// 返回的相應(yīng)數(shù)據(jù)
}
/*
* 定義一個(gè)請(qǐng)求和處理等級(jí)
* */
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) {
// 創(chuàng)建所有可能的處理節(jié)點(diǎn)
HandlerOne handlerOne = new HandlerOne();
HandlerTwo handlerTwo = new HandlerTwo();
HandlerThree handlerThree = new HandlerThree();
// 設(shè)置責(zé)任連的執(zhí)行順序
handlerOne.setNextHandler(handlerTwo);
handlerTwo.setNextHandler(handlerThree);
Response response = handlerOne.handleMessage(new Request());
}
}
優(yōu)點(diǎn):
- 將請(qǐng)求和處理分開(kāi)艾栋,解除耦合提高系統(tǒng)的靈活性
缺點(diǎn):
- 性能問(wèn)題
- 調(diào)試不便爆存,特別是責(zé)任連較長(zhǎng)、環(huán)節(jié)較多蝗砾,由于采用了類似遞歸的方法先较,調(diào)試邏輯較復(fù)雜携冤。
注意事項(xiàng):
- 需要控制鏈中節(jié)點(diǎn)的數(shù)量,避免出現(xiàn)超長(zhǎng)鏈的情況闲勺,通常的做法是Handler中設(shè)置最大的節(jié)點(diǎn)數(shù)量曾棕,在setNext方法中判斷是否已經(jīng)超過(guò)閾值,避免降低系統(tǒng)性能菜循。