1. 程式人生 > >Java設計模式—責任鏈模式

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方法中判斷是否已經是超過其閾值,超過則不允許該鏈建立,避免無意識地破壞系統性能。