Java設計模式—責任鏈模式
責任鏈模式的定義:
使多個物件都有機會處理請求,從而避免了請求的傳送者和接受者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。
責任鏈模式的重點是在“鏈”上,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請求,並返回相應的結果。
責任鏈模式的通用類圖如下所示:
通用原始碼:
抽象的處理者實現三個職責:package com.package4; public class Test4{ public static void main(String[] args){ //宣告所有的處理節點 Handler handler1 = new ConcreteHandler1(); Handler handler2 = new ConcreteHandler2(); Handler handler3 = new ConcreteHandler3(); //設定鏈中的階段順序1-->2-->3 handler1.setNext(handler2); handler2.setNext(handler3); //提交請求,返回結果 Response response = handler1.handleMessage(new Request()); } } 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 Level getHandlerLevel(); //每個處理者都必須實現處理任務 protected abstract Response echo(Request request); } class ConcreteHandler1 extends Handler { //定義自己的處理邏輯 protected Response echo(Request request) { //完成處理邏輯 return null; } //設定自己的處理級別 protected Level getHandlerLevel() { //設定自己的處理級別 return null; } } class ConcreteHandler2 extends Handler { //定義自己的處理邏輯 protected Response echo(Request request) { //完成處理邏輯 return null; } //設定自己的處理級別 protected Level getHandlerLevel() { //設定自己的處理級別 return null; } } class ConcreteHandler3 extends Handler { //定義自己的處理邏輯 protected Response echo(Request request) { //完成處理邏輯 return null; } //設定自己的處理級別 protected Level getHandlerLevel() { //設定自己的處理級別 return null; } } class Level { //定義一個請求和處理等級 } class Request { //請求的等級 public Level getRequestLevel(){ return null; } } class Response { //處理者返回的資料 }
一是定義一個請求的處理方法handle Message,唯一對外開放的方法;
二是定義一個鏈的編排方法setNext,設定下一個處理者;
三是定義了具體的請求者必須實現的兩個方法:定義自己能夠處理的級別get Handler Level和具體的處理任務echo。
/*************************************************************************************************
注意handler Message方法前的final關鍵字,模板方法模式中的模板方法也是final型別的。
**************************************************************************************************/
1、責任鏈模式的優點:
責任鏈模式非常顯著的優點是將請求和處理分開。
2、責任鏈模式的缺點:
一是效能問題,每個請求都是從鏈頭遍歷到鏈尾,特別是在鏈比較長的時候,效能是一個非常大的問題。
二是除錯不很方便,特別是鏈條比較長,環節比較多的時候,由於採用了類似遞迴的方式,除錯的時候邏輯可能比較複雜。
3、使用責任鏈模式的注意事項:
鏈中節點數量需要控制,避免出現超長鏈的情況,一般的做法是在Handler中設定一個最大節點數量,在setNext方法中判斷是否已經是超過其閾值,超過則不允許該鏈建立,避免無意識地破壞系統性能。