設計模式學習筆記——責任鏈模式

責任鏈模式

責任鏈模式,使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關係。將這些對象連成一條鏈,並沿着這條鏈傳遞該請求,直到有對象處理它爲止。

結構圖


代碼實現

請求類Request:
/**
 * 請求類
 *
 * @author xukai 2016年4月4日 下午1:13:24
 * 
 */
public class Request {

	Level level;

	public Request(Level level) {
		super();
		this.level = level;
	}

	public Level getLevel() {
		return level;
	}

}

請求等級類Level:決定請求由誰來處理
/**
 * 請求級別類
 *
 * @author xukai 2016年4月4日 下午1:20:51
 * 
 */
public class Level {

	private int level = 0;
	
	public Level(int level) {
		this.level = level;
	}
	
	/**
	 * 當前等級大於或等於	return true<br>
	 * @param level
	 * @return
	 */
	public boolean above(Level level){
		if(this.level >= level.level){
			return true;
		}
		return false;
	}
	
}

抽象處理類Handler:
/**
 * 定義一個處理請示的接口
 *
 * @author xukai 2016年4月4日 下午1:07:22
 * 
 */
public abstract class Handler {

	protected Handler nextHandler;

	/**
	 * 處理請求
	 * 
	 * @param request
	 * @return
	 */
	public final Response handleRequest(Request request) {
		Response response = null;
		if (this.getHandlerLevel().above(request.getLevel())) {
			// 處理者處理等級高於或等於當前請求中的等級,處理請求
			response = this.response(request);
		} else {
			// 處理者處理等級低於當前請求中的等級
			if (this.nextHandler != null) {
				this.nextHandler.handleRequest(request);
			} else {
				System.out.println("沒有合適的處理者");
			}
		}
		return response;
	}

	/**
	 * 獲取處理者處理等級
	 * 
	 * @return
	 */
	protected abstract Level getHandlerLevel();

	/**
	 * 處理請求,返回響應
	 * 
	 * @param request
	 * @return
	 */
	public abstract Response response(Request request);

	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}

}

具體處理請求類ConcreteHandler1:
/**
 * 具體處理者1
 *
 * @author xukai 2016年4月4日 下午1:26:31
 * 
 */
public class ConcreteHandler1 extends Handler {

	@Override
	protected Level getHandlerLevel() {
		return new Level(1);
	}

	@Override
	public Response response(Request request) {
		System.out.println("請求被處理者1處理");
		return null;
	}

}

ConcreteHandler2:
/**
 * 具體處理者2
 *
 * @author xukai 2016年4月4日 下午1:28:08
 * 
 */
public class ConcreteHandler2 extends Handler {

	@Override
	protected Level getHandlerLevel() {
		return new Level(3);
	}

	@Override
	public Response response(Request request) {
		System.out.println("請求被處理者2處理");
		return null;
	}

}

處理請求直到返回的響應Response:
/**
 * 響應類
 *
 * @author xukai 2016年4月4日 下午1:14:19
 * 
 */
public class Response {

}

客戶端測試:
public class Client {

	@SuppressWarnings("unused")
	public static void main(String[] args) {

		Handler handler1 = new ConcreteHandler1();
		Handler handler2 = new ConcreteHandler2();
		Handler handler3 = new ConcreteHandler3();

		handler1.setNextHandler(handler2);
		handler2.setNextHandler(handler3);

		Response response = handler1.handleRequest(new Request(new Level(2)));
		response = handler1.handleRequest(new Request(new Level(4)));
		response = handler1.handleRequest(new Request(new Level(6)));

	}

}

控制檯輸出:
請求被處理者2處理
請求被處理者3處理
沒有合適的處理者

總結

優點:責任鏈模式與if ...else相比,耦合性相對較低一些,條件判斷都分散到了各個處理類中。

缺點:判定條件都要被執行一遍,當責任鏈較長時,性能問題嚴重。

*不要在鏈中出現循環引用的問題。



發佈了94 篇原創文章 · 獲贊 66 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章