一、
二、
三、内容
1. 责任链模式
责任链模式:责任链模式就是很多对象由每个对象对其下家的引用而连接起来形成一条链,请求在这条链上传递,知道链上的某个对象处理此请求,或者每个对象都可以处理请求,并传给"下家",知道最终链上每个对象都处理完。这样可以不影响客户端而能够在链上增加任意的处理节点。
责任链包含下面两个角色
- Handle(抽象处理者):定义一个处理请求的接口。
- ConcreteHandler(具体处理者):处理请求的具体类,或者传给"下家"。
下面举个日常开发的例子,比如我们现在开发一个任务,那么就需要合作,前端或者app处理页面,网关层作为中间层负责整合各个后台底层数据返回给前端,那么现在这个链上就有前端、网关、后台,突然一个需求测试提了一个bug,那么按照链的形式,从前端传给网关,从网关到后台,一层层的传递,那么这种责任链的代码如下:
public abstract class BugHandler {
protected BugHandler bugHandler;
public abstract String bug(String name);
public BugHandler getBugHandler() {
return bugHandler;
}
public void setBugHandler(BugHandler bugHandler) {
this.bugHandler = bugHandler;
}
}
public class ActivityDevBugHandler extends BugHandler {
public String bug(String name) {
String bug = "";
if("activity-1".equals(name)){
bug ="这个bug是活动组" + name + "的bug";
}else {
getBugHandler().bug(name);
}
return bug;
}
}
public class GatewayDevBugHandler extends BugHandler {
public String bug(String name) {
String bug = "";
if("geteway-1".equals(name)){
bug ="这个bug是网关组" + name + "的bug";
}else {
getBugHandler().bug(name);
}
return bug;
}
}
public class MobileDevBugHandler extends BugHandler {
public String bug(String name) {
String bug = "";
if("mobile-1".equals(name)){
bug ="这个bug是app移动组" + name + "的bug";
}else {
getBugHandler().bug(name);
}
return bug;
}
}
public class Main {
public static void main(String[] args) {
BugHandler bugHandler1 = new ActivityDevBugHandler();
BugHandler bugHandler2 = new GatewayDevBugHandler();
BugHandler bugHandler3 = new MobileDevBugHandler();
bugHandler3.setBugHandler(bugHandler2);
bugHandler2.setBugHandler(bugHandler1);
String str = bugHandler1.bug("activity-1");
System.out.println(str);
}
}
2.filter中责任链的使用
从一个filter到下一个filter是经过tomcat容器的ApplicationFilterChain来做转发
tomcat源码中精简后的代码:
private void internalDoFilter(ServletRequest request,
ServletResponse response)
throws IOException, ServletException {
if (pos < n) {//还有未执行的filter
ApplicationFilterConfig filterConfig = filters[pos++];
Filter filter = filterConfig.getFilter();
filter.doFilter(request, response, this);
}else{//直接调用service
servlet.service(request, response);
}
}
servlet.service(request, response);调用HttpServlet中的service(ServletRequest req, ServletResponse res)方法,再在service(HttpServletRequest req, HttpServletResponse resp)中判断请求是get,post...,执行doGet.doPost...方法,FrameworkServlet中的doGet.doPost...方法到调用processRequest(HttpServletRequest request, HttpServletResponse response)方法,进而调用doService(request, response);到DispatcherServlet中...