設計模式——責任鏈模式


 

責任鏈模式:將能夠處理同一類請求的對象連成一條鏈所提交的請求沿着鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求,

                 如果能則處理,如果不能則傳遞給鏈上的下一個對象。
優點:將請求者和發送者解耦
         簡化對象的處理過程
         可以通過改變鏈中的成員或成員的順序來動態的新增或則刪除責任。

缺點:不能保證請求一定會執行,可能或落到責任鏈之外。

         不容易觀察運行時的特征,處理請求的方法比較分散。
實現方式:鏈表和非鏈表兩種實現,但是使用集合和數組等非鏈表實現在實際開發中更方便更常用。

應用:

窗口事件的處理。
Java中的異常機制就是一種責任鏈模式,catch鏈就是一種責任鏈。
JavaScript中的時間冒泡和捕獲機制。
Servlet中的過濾器的鏈式處理。
Structs2中攔截器的調用。

這個解釋很詳細:http://www.cnblogs.com/java-my-life/archive/2012/05/28/2516865.html

Demo:

 

package com.wxisme.chainofresposibility;

/**
 * 責任鏈
 * @author wxisme
 *
 */
public abstract class Handler {
	protected Handler nextHandler;
	public abstract void handleRequest(int req);
	public Handler getNextHandler() {
		return nextHandler;
	}
	public void setNextHandler(Handler nextHandler) {
		this.nextHandler = nextHandler;
	}
	
}

class ConcreteHandler1 extends Handler {
	
	@Override
	public void handleRequest(int req) {
		if(req == 1) {
			System.out.println("1處理請求");
		}
		else {
			System.out.println("1釋放請求");
			this.nextHandler.handleRequest(req);
		}
	}
}
class ConcreteHandler2 extends Handler {
	
	@Override
	public void handleRequest(int req) {
		if(req == 2) {
			System.out.println("2處理請求");
		}
		else {
			System.out.println("2釋放請求");
			this.nextHandler.handleRequest(req);
		}
	}
}
class ConcreteHandler3 extends Handler {
	
	@Override
	public void handleRequest(int req) {
		if(req == 3) {
			System.out.println("3處理請求");
		}
		else {
			System.out.println("3釋放請求");
			this.nextHandler.handleRequest(req);
		}
	}
}

public class Client {
	public static void main(String[] args) {
		Handler h1 = new ConcreteHandler1();
		Handler h2 = new ConcreteHandler2();
		Handler h3 = new ConcreteHandler3();
		
		h1.setNextHandler(h2);
		h2.setNextHandler(h3);
		
		h1.handleRequest(1);
		System.out.println("-----------");
		h1.handleRequest(2);
		System.out.println("-----------");
		h1.handleRequest(3);
	}
}

 

 運行結果:
1處理請求
-----------
1釋放請求
2處理請求
-----------
1釋放請求
2釋放請求
3處理請求

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM