設計模式之禪學習筆記--責任鏈模式
阿新 • • 發佈:2019-01-09
一、定義
使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
責任鏈模式的重點是在“鏈”上,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請求,並返回相應的結果。
二、通用類圖
責任鏈模式的核心在“鏈”上,“鏈”是由多個處理者ConcreteHandler組成的。
1:抽象的處理者實現三個職責:一是定義一個請求的處理方法handleMessage,唯一對外開放的方法;二是定義一個鏈的編排方法setNet,設定下一個處理者;三是定義了具體的請求者必須實現的兩個方法:定義自己能夠處理的級別getHandlerLevel和具體的處理任務echo。
2:處理者中涉及三個類:Level類負責定義請求和處理的級別,Request類負責封裝請求,Response負責封裝鏈中返回的結果。
三、通用程式碼
1:抽象處理者
2:具體處理者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 { //沒有適當的處理者,業務自行處理 } } return response; } //設定下一個處理者是誰 public void setNext(Handler handler) { this.nextHandler = handler; } protected abstract Response echo(Request request); protected abstract Object getHandlerLevel(); }
public class ConcreteHandler1 extends Handler { //定義自己的處理邏輯 @Override protected Response echo(Request request) { System.out.println("ConcreteHandler1 echo"); //完成處理邏輯 return null; } //設定自己的處理級別 @Override protected Level getHandlerLevel() { System.out.println("ConcreteHandler1 getHandlerLevel"); return null; } }
public class ConcreteHandler2 extends Handler {
//定義自己的處理邏輯
@Override
protected Response echo(Request request) {
System.out.println("ConcreteHandler2 echo");
//完成處理邏輯
return null;
}
//設定自己的處理級別
@Override
protected Level getHandlerLevel() {
System.out.println("ConcreteHandler2 getHandlerLevel");
return null;
}
}
public class ConcreteHandler3 extends Handler {
//定義自己的處理邏輯
@Override
protected Response echo(Request request) {
System.out.println("ConcreteHandler3 echo");
//完成處理邏輯
return null;
}
//設定自己的處理級別
@Override
protected Level getHandlerLevel() {
System.out.println("ConcreteHandler3 getHandlerLevel");
return null;
}
}
3:具體處理者涉及的三個類
public class Level {
//定義一個請求和處理等級
}
public class Request {
//請求的等級
public Level getRequestLevel() {
return null;
}
}
public class Response {
//處理者返回的資料
}
4:場景類
public class Client {
public static void main(String[] args) {
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
Handler handler3 = new ConcreteHandler3();
//設定鏈中的順序1-->2-->3
handler1.setNext(handler2);
handler3.setNext(handler3);
//提出請求,放回結果
Response response = handler1.handleMessage(new Request());
}
}
實際應用中,一般會有一個封裝類對責任模式進行封裝,也就是代替Client類,直接返回鏈中的第一個處理者,具體鏈的設定不需要高層次模組關係,這樣更簡化了高層次模組的呼叫,減少模組間的耦合,提高系統的靈活性。
四、責任鏈模式的優缺點
1:優點。責任鏈模式將請求和處理分開,提高系統靈活性。
2:缺點。效能為題,每個請求都是從鏈頭便利到鏈尾;除錯不方便,鏈條比較長,環節比較多時。
五、注意點
1:責任鏈模式中一個請求傳送到鏈中後,前一節點消費部分訊息,然後交由後續節點繼續處理,最終可以處理結果也可以沒有處理結果。
2:鏈條節點數量需要控制,避免出現超長鏈的情況。