責任鏈模式:將能夠處理同一類請求的對象連成一條鏈所提交的請求沿着鏈傳遞,鏈上的對象逐個判斷是否有能力處理該請求,
如果能則處理,如果不能則傳遞給鏈上的下一個對象。
優點:將請求者和發送者解耦
簡化對象的處理過程
可以通過改變鏈中的成員或成員的順序來動態的新增或則刪除責任。
缺點:不能保證請求一定會執行,可能或落到責任鏈之外。
不容易觀察運行時的特征,處理請求的方法比較分散。
實現方式:鏈表和非鏈表兩種實現,但是使用集合和數組等非鏈表實現在實際開發中更方便更常用。
應用:
窗口事件的處理。
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處理請求
