责任链模式
1.定义#
使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关系。将这些对象连成一条链。并沿着这条链传递该请求,直到有对象处理它为止。
责任链使用了一种递归的方式查找符合条件的对象处理请求。所有的处理对象被串联成一个对象链,请求者从第一个对象开始从头到尾尝试每一个对象找到合适的对象则返回一个响应。Handler类使用模板模式实现了责任处理流程handleMessage;实现了设置责任链的方法setNext;定义了具体处理者ConcreteHandler的处理方法echo。
Invoke类封装了责任链的构成方法setLink。
2.类图#
类图3.实现#
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{
//处理者响应数据
}
##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责任链优缺点#
优点:请求和处理分离。
缺点:责任链过长导致性能问题。注意控制责任链长度。