责任链模式
的主要作用是:职责分离、任务传递。
解读
关键角色
责任链中包含两个关键角色:Chain、Processor。
Chain负责将所有的Processer关联起来,也可以称为是Processor的Container。所有的Processer都实现同一个抽象接口,每个Processor负责自己的工作内容,同时决定是否继续链式调用。
图示
责任链模式的关键类图和时序图如下所示:
image.png
示例
在servlet项目中,Filter是一个典型的使用了责任链模式的场景。
Filter关键代码
public interface Filter {
/**
* 由于外部请求到来,触发了Filter.doFilter的执行;当前Filter执行完毕后,可以决定是否触发Chain里的下一个Filter执行,或者是直接结束掉调用链的执行。
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException{
//filter 业务处理
...
//触发后续filter调用
chain.doFilter(request, response);
...
}
}
FilterChain关键代码
private class Chain implements FilterChain
{
//责任链
final List<FilterHolder> _chain;
//负责处理该请求的Servlet
final ServletHolder _servletHolder;
//当前处理到哪个filter
int _filter= 0;
/* ------------------------------------------------------------ */
@Override
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException
{
// pass to next filter
if (_filter < _chain.size())
{
FilterHolder holder= _chain.get(_filter++);
Filter filter= holder.getFilter();
filter.doFilter(request, response, this);
return;
}
// 当所有Filter执行完毕,Call servlet
...
_servletHolder.handle(_baseRequest,request, response);
...
}
参考资料
https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern