责任链模式(Chain of Responsibility Pattern)也被称为职责链模式,是在 GoF 23 种设计模式中定义了的行为型模式。 责任链模式 是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。 责任链模式 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。 ~ 本篇文章内容包括:关于责任链模式、责任链模式 Demo(伪代码)、责任链模式 Demo(模拟 FilterChain)
首先它可以对同一模块中有先后执行顺序要求的类或对象进行成链,以达到高聚合的目的。同时对于单一执行状态下的执行步骤,可以通过非状态模式的成链方式进行组装,便可以实现改变执行顺序的目的,让代码维护性变高。
责任链模式(Chain of Responsibility Pattern)也被称为职责链模式,是在 GoF 23 种设计模式中定义了的行为型模式。
责任链模式 是将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求从链式的首段发出时,会沿着链的路径依此传递给每一个节点对象,直至有对象处理这个请求为止。
责任链模式 将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。
责任链模式主要包含以下 2 种角色:
# 责任链模式的优点
# 责任链模式的缺点
# Handler
public abstract class Handler {
private Handler next;
/**
* 用来设置下一个处理者
* @param next Handler
*/
public void setNext(Handler next) {
this.next=next;
}
public Handler getNext() {
return next;
}
/**
* 处理请求的方法
* @param request String
*/
public abstract void handleRequest(String request);
}
# ConcreteHandler
public class ConcreteHandler1 extends Handler {
@Override
public void handleRequest(String request) {
if("one".equals(request)) {
System.out.println("具体处理者1负责处理该请求!");
}
else {
if(getNext()!=null) {
getNext().handleRequest(request);
}
else {
System.out.println("没有人处理该请求!");
}
}
}
}
public class ConcreteHandler2 extends Handler {
@Override
public void handleRequest(String request) {
if("two".equals(request)) {
System.out.println("具体处理者2负责处理该请求!");
}
else {
if(getNext()!=null) {
getNext().handleRequest(request);
}
else {
System.out.println("没有人处理该请求!");
}
}
}
}
public class Client {
public static void main(String[] args) {
//组装责任链
Handler handler1 = new ConcreteHandler1();
Handler handler2 = new ConcreteHandler2();
handler1.setNext(handler2);
//提交请求
handler1.handleRequest("two");
}
}
在 JavaWeb 应用开发中,FilterChain 是职责链(过滤器)模式的典型应用,以下是 Filter 的模拟实现分析
# 模拟 web 请求 Request 以及 web 响应 Response
public interface Request{}
public interface Response{}
# Filter 过滤器
public interface Filter {
public void doFilter(Request req,Response res,FilterChain c);
}
# FirstFilter 具体过滤器
public class FirstFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器1 前置处理");
// 先执行所有request再倒序执行所有response
chain.doFilter(request, response);
System.out.println("过滤器1 后置处理");
}
}
public class SecondFilter implements Filter {
@Override
public void doFilter(Request request, Response response, FilterChain chain) {
System.out.println("过滤器2 前置处理");
// 先执行所有request再倒序执行所有response
chain.doFilter(request, response);
System.out.println("过滤器2 后置处理");
}
}
# FilterChain 过滤器链
public class FilterChain {
private List<Filter> filters = new ArrayList<Filter>();
private int index = 0;
// 链式调用
public FilterChain addFilter(Filter filter) {
this.filters.add(filter);
return this;
}
public void doFilter(Request request, Response response) {
if (index == filters.size()) {
return;
}
Filter filter = filters.get(index);
index++;
filter.doFilter(request, response, this);
}
}
public class Client {
public static void main(String[] args) {
Request req = null;
Response res = null ;
FilterChain filterChain = new FilterChain();
filterChain.addFilter(new FirstFilter()).addFilter(new SecondFilter());
filterChain.doFilter(req,res);
}
}