一尊浓、定義
責(zé)任鏈模式定義如下:
Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多個對象都有機會處理請求拄踪,從而避免了請求的發(fā)送者和接受者之間的耦合關(guān)系城瞎。將這些對象連成一條鏈崎弃,并沿著這條鏈傳遞該請求甘晤,直到有對象處理它為止。)
責(zé)任鏈模式的重點是在“鏈”上饲做,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請 求线婚,并返回相應(yīng)的結(jié)果。
//抽象處理者
public abstract class Handler {
private Handler nextHandler;
//每個處理者都必須對請求做出處理
public final Response handleMessage(Request request){
Response response = null; //判斷是否是自己的處理級別
if(this.getHandlerLevel().equals(request.getRequestLevel()){
response = this.echo(request);
} else { //不屬于自己的處理級別
//判斷是否有下一個處理者
if(this.nextHandler != null){
response = this.nextHandler.handleMessage(request);
} else {
//沒有適當?shù)奶幚碚吲杈瑯I(yè)務(wù)自行處理
}
}
return response;
} //設(shè)置下一個處理者是誰
public void setNext(Handler _handler){
this.nextHandler = _handler;
}
//每個處理者都有一個處理級別
protected abstract Level getHandlerLevel(); //每個處理者都必須實現(xiàn)處理任務(wù)
protected abstract Response echo(Request request);
}
//具體處理者
public class ConcreteHandler1 extends Handler {
//定義自己的處理邏輯
protected Response echo(Request request) {
//完成處理邏輯
return null;
}
//設(shè)置自己的處理級別
protected Level getHandlerLevel() {
//設(shè)置自己的處理級別
return null;
}
}
public class ConcreteHandler2 extends Handler {
//定義自己的處理邏輯
protected Response echo(Request request) {
//完成處理邏輯
return null;
}
//設(shè)置自己的處理級別
protected Level getHandlerLevel() {
//設(shè)置自己的處理級別
return null;
}
}
public class ConcreteHandler3 extends Handler {
//定義自己的處理邏輯
protected Response echo(Request request) {
//完成處理邏輯
return null;
}
//設(shè)置自己的處理級別
protected Level getHandlerLevel() {
//設(shè)置自己的處理級別
return null;
}
}
//模式中有關(guān)框架代碼
public class Level {
//定義一個請求和處理等級
}
public class Request {
//請求的等級
public Level getRequestLevel(){
return null;
}
}
public class Response {
//處理者返回的數(shù)據(jù)
}
//場景類
public class Client {
public static void main(String[] args) {
//聲明所有的處理節(jié)點
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
//設(shè)置鏈中的階段順序1-->2-->3
handler1.setNext(handler2);
handler2.setNext(handler3);
//提交請求塞弊,返回結(jié)果
Response response = handler1.handlerMessage(new Request());
}
}
二、應(yīng)用
2.1 優(yōu)點
責(zé)任鏈模式非常顯著的優(yōu)點是將請求和處理分開泪姨。請求者可以不用知道是誰處理的游沿,處 理者可以不用知道請求的全貌(例如在J2EE項目開發(fā)中,可以剝離出無狀態(tài)Bean由責(zé)任鏈處理)肮砾,兩者解耦诀黍,提高系統(tǒng)的靈活性。
2.2 缺點
責(zé)任鏈有兩個非常顯著的缺點:一是性能問題仗处,每個請求都是從鏈頭遍歷到鏈尾眯勾,特別 是在鏈比較長的時候,性能是一個非常大的問題婆誓。二是調(diào)試不很方便吃环,特別是鏈條比較長, 環(huán)節(jié)比較多的時候洋幻,由于采用了類似遞歸的方式郁轻,調(diào)試的時候邏輯可能比較復(fù)雜。
2.3 注意事項
鏈中節(jié)點數(shù)量需要控制文留,避免出現(xiàn)超長鏈的情況范咨,一般的做法是在Handler中設(shè)置一個 最大節(jié)點數(shù)量故觅,在setNext方法中判斷是否已經(jīng)是超過其閾值,超過則不允許該鏈建立渠啊,避免 無意識地破壞系統(tǒng)性能输吏。