责任链模式(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 {@Overridepublic 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 {@Overridepublic 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 {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {System.out.println("过滤器1 前置处理");// 先执行所有request再倒序执行所有responsechain.doFilter(request, response);System.out.println("过滤器1 后置处理");}
}public class SecondFilter implements Filter {@Overridepublic void doFilter(Request request, Response response, FilterChain chain) {System.out.println("过滤器2 前置处理");// 先执行所有request再倒序执行所有responsechain.doFilter(request, response);System.out.println("过滤器2 后置处理");}
}
# FilterChain 过滤器链
public class FilterChain {private List filters = new ArrayList();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);}
}