1.定義#
使多個對象都有機會處理請求,從而避免了請求的發(fā)送者和接受者之間的耦合關系谓苟。將這些對象連成一條鏈官脓。并沿著這條鏈傳遞該請求,直到有對象處理它為止娜谊。
責任鏈使用了一種遞歸的方式查找符合條件的對象處理請求确买。所有的處理對象被串聯(lián)成一個對象鏈,請求者從第一個對象開始從頭到尾嘗試每一個對象找到合適的對象則返回一個響應纱皆。Handler類使用模板模式實現(xiàn)了責任處理流程handleMessage湾趾;實現(xiàn)了設置責任鏈的方法setNext;定義了具體處理者ConcreteHandler的處理方法echo派草。
Invoke類封裝了責任鏈的構成方法setLink搀缠。
2.類圖#
3.實現(xiàn)#
3.1抽象處理者##
抽象處理者主要有三個職責:第一處理請求的方法handleMessage第二設置責任鏈的方法setNext第三定義具體處理者的處理方法echo
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.handlerMessage(request);
}
}
return response;
}
public void setNext(Handler _handler)
{
this.nextHandler = _handler;
}
//獲取當前處理者級別
protected abstract Level getHandlerLevel();
//當前處理者處理
protected abstract Response echo(Request request);
}
```
##3.2具體處理者##
public class ConcreteHandler1 extends Handler{
protected Response echo(Request request)
{
//處理任務
return null;
}
protected Level getHandlerLevel()
{
//獲取當前處理者等級
return null;
}
}
public class ConcreteHandler2 extends Handler{
protected Response echo(Request request)
{
//處理任務
return null;
}
protected Level getHandlerLevel()
{
//獲取當前處理者等級
return null;
}
}
public class ConcreteHandler3 extends Handler{
protected Response echo(Request request)
{
//處理任務
return null;
}
protected Level getHandlerLevel()
{
//獲取當前處理者等級
return null;
}
}
##3.3相關模塊##
public class Level{
//處理等級
}
public class Request{
public Level getRequestLevel(){}
}
public class Response{
//處理者響應數(shù)據(jù)
}
##3.4責任鏈組裝者##
public class Invoke{
public static Handler concreteHandler1 = new ConcreteHandler1();
public static Handler concreteHandler2 = new ConcreteHandler2();
public static Handler concreteHandler3 = new ConcreteHandler3();
public Handler getHandlerLink(){
concreteHandler1.setNext(concreteHandler2);
concreteHandler2.setNext(concreteHandler3);
return concreteHandler1;
}
}
##3.5場景類##
public class Client{
public static void main(String[] args)
{
Invoke invoke = new Invoke();
Response response = invoke.getHandlerLink().handlerMessage(request);
}
}
#4責任鏈優(yōu)缺點#
優(yōu)點:請求和處理分離。
缺點:責任鏈過長導致性能問題近迁。注意控制責任鏈長度艺普。