1. 程式人生 > >設計模式之禪學習筆記--責任鏈模式

設計模式之禪學習筆記--責任鏈模式

一、定義

使多個物件都有機會處理請求,從而避免了請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有物件處理它為止。

責任鏈模式的重點是在“鏈”上,由一條鏈去處理相似的請求在鏈中決定誰來處理這個請求,並返回相應的結果。

二、通用類圖


責任鏈模式的核心在“鏈”上,“鏈”是由多個處理者ConcreteHandler組成的。

1:抽象的處理者實現三個職責:一是定義一個請求的處理方法handleMessage,唯一對外開放的方法;二是定義一個鏈的編排方法setNet,設定下一個處理者;三是定義了具體的請求者必須實現的兩個方法:定義自己能夠處理的級別getHandlerLevel和具體的處理任務echo。

2:處理者中涉及三個類:Level類負責定義請求和處理的級別,Request類負責封裝請求,Response負責封裝鏈中返回的結果。

三、通用程式碼

1:抽象處理者

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();
	
	
}
2:具體處理者
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:鏈條節點數量需要控制,避免出現超長鏈的情況。