概念

  • 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。属于对象行为型模式
  • image.png

主要角色

  • 抽象处理者(Handler)角色:
    • 定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  • 具体处理者(Concrete Handler)角色:
    • 实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
  • 客户类(Client)角色:

    • 创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程 ```java /**

      • 抽象处理者(Handler)角色 */ public interface Filter {

      void doFilter(Request request,Response response,FilterChain chain); }

  1. ```java
  2. /**
  3. * 具体处理者(Concrete Handler)角色
  4. */
  5. public class CharacterFilter implements Filter{
  6. @Override
  7. public void doFilter(Request request, Response response, FilterChain chain) {
  8. //功能
  9. request.msg +=" ====";
  10. System.out.println("CharacterFilter...doFilter之前");
  11. //放行
  12. chain.doFilter(request,response,chain);
  13. System.out.println("CharacterFilter...doFilter之后");
  14. }
  15. }
  1. /**
  2. * 具体处理者(Concrete Handler)角色
  3. */
  4. public class EncodingFilter implements Filter{
  5. @Override
  6. public void doFilter(Request request, Response response, FilterChain chain) {
  7. request.msg+=" oooo";
  8. System.out.println("EncodingFilter...doFilter之前");
  9. //放行
  10. chain.doFilter(request,response,chain);
  11. System.out.println("EncodingFilter...doFilter之后");
  12. }
  13. }
  1. /**
  2. * 具体处理者(Concrete Handler)角色
  3. */
  4. public class HttpFilter implements Filter{
  5. @Override
  6. public void doFilter(Request request, Response response, FilterChain chain) {
  7. //第一个filter的功能
  8. request.msg+=">>>";
  9. System.out.println("HttpFilter...doFilter之前");
  10. //放行
  11. chain.doFilter(request,response,chain);
  12. System.out.println("HttpFilter...doFilter之后");
  13. }
  14. }
  1. /**
  2. * 靠他维护链条
  3. *
  4. * HandlerExecutionChain
  5. *
  6. */
  7. public class FilterChain implements Filter {
  8. //记录当前执行的步骤
  9. int cursor = 0;
  10. //filter的链
  11. List<Filter> filtersChain = new ArrayList<>();
  12. //最终要执行的目标方法
  13. My target;
  14. public void setTarget(My target) {
  15. this.target = target;
  16. }
  17. public My getTarget() {
  18. return target;
  19. }
  20. //添加filter
  21. void addFilter(Filter filter){
  22. filtersChain.add(filter);
  23. }
  24. @Override
  25. public void doFilter(Request request, Response response, FilterChain chain) {
  26. //第一次执行第一个filter,一次往下
  27. //游标小于总数量filter一直往下获取执行
  28. if(cursor < filtersChain.size()){
  29. Filter filter = filtersChain.get(cursor);
  30. cursor++;
  31. //执行filter
  32. filter.doFilter(request,response,chain);
  33. }else {
  34. //filter完了,该执行目标方法了
  35. target.hello();
  36. }
  37. }
  38. }
  1. /**
  2. * 1---2---3--my---3---2---1]
  3. * 客户类(Client)角色
  4. */
  5. public class MainTest {
  6. public static void main(String[] args) {
  7. FilterChain chain = new FilterChain();
  8. //web.xml =- filter
  9. HttpFilter filter = new HttpFilter();
  10. CharacterFilter characterFilter = new CharacterFilter();
  11. EncodingFilter encodingFilter = new EncodingFilter();
  12. chain.addFilter(filter);
  13. chain.addFilter(characterFilter);
  14. chain.addFilter(encodingFilter);
  15. chain.setTarget(new My());
  16. //filter如何链式执行。
  17. chain.doFilter(new Request("hello world"),
  18. new Response("adhkjasdhak"),chain);
  19. }
  20. }

应用场景

  • Tomcat的Pipeline、Valve
  • Filter链
  • Aop责任链