责任链模式:Chain Of Responsibility,为请求创建了一个接受者对象的链,使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系
    应用场景:一个请求的处理需要多个对象当中的一个或多个协作处理
    优点:

    • 请求的发送者和接受者解耦
    • 可以控制执行顺序
    • 复合开闭原则和单一职责原则

    经典案例:

    • javax.servlet.Filter
    • javax.servlet.FilterChain

    未命名绘图.png
    责任链模式示例:

    • 创建一个 Handler,每个 Handler 都保存着下一个 Handler 的位置,通过自定义不同的 Handler 和组装,从而实现处理流程的自由定制

      1. public class ChainOfResponsibility {
      2. public static void main(String[] args) {
      3. Request request = new Request(true, true, true, true, "请求");
      4. // 创建一个责任链
      5. FrequencyHandler handler = new FrequencyHandler(new LoginHandler());
      6. // 使用责任链处理请求
      7. if(handler.process(request)){
      8. System.out.println("请求成功!");
      9. } else {
      10. System.out.println("请求被拦截!");
      11. }
      12. }
      13. @Data
      14. @NoArgsConstructor
      15. @AllArgsConstructor
      16. @Accessors(chain = true)
      17. public static class Request {
      18. // 是否登录
      19. private boolean login;
      20. // 访问频率
      21. private boolean frequency;
      22. // 访问权限
      23. private boolean permission;
      24. // 敏感字
      25. private boolean containSensitiveWords;
      26. // 请求体
      27. private String requestBody;
      28. }
      29. // 责任链模式的处理器
      30. abstract static class Handler {
      31. // 指向下一个处理器
      32. Handler next;
      33. public Handler() {
      34. this(null);
      35. }
      36. // 传入下一个处理器
      37. public Handler(Handler next) {
      38. this.next = next;
      39. }
      40. public Handler getNext() {
      41. return next;
      42. }
      43. public void setNext(Handler next) {
      44. this.next = next;
      45. }
      46. abstract boolean process(Request request);
      47. }
      48. static class LoginHandler extends Handler {
      49. public LoginHandler() {
      50. super();
      51. }
      52. public LoginHandler(Handler handler) {
      53. super(handler);
      54. }
      55. @Override
      56. boolean process(Request request) {
      57. System.out.println("进入登录验证!");
      58. // 用户已登录
      59. if (request.isLogin()) {
      60. Handler next = getNext();
      61. // 不存在下一个处理结点
      62. if (null == next) {
      63. return true;
      64. } else return next.process(request); //进入下一个处理单元
      65. }
      66. // 用户未登录
      67. System.out.println("用户未登录,拒绝请求!");
      68. return false;
      69. }
      70. }
      71. static class FrequencyHandler extends Handler {
      72. public FrequencyHandler() {
      73. super();
      74. }
      75. public FrequencyHandler(Handler next) {
      76. super(next);
      77. }
      78. @Override
      79. boolean process(Request request) {
      80. System.out.println("进入频率控制模块!");
      81. // 用户请求频率合乎要求
      82. if (request.isFrequency()) {
      83. Handler next = getNext();
      84. // 不存在下一个处理结点
      85. if (null == next) {
      86. return true;
      87. } else return next.process(request); //进入下一个处理单元
      88. }
      89. System.out.println("用户请求过快,请稍后再试!");
      90. return false;
      91. }
      92. }
      93. static class PermissionHandler extends Handler {
      94. public PermissionHandler() {
      95. super();
      96. }
      97. public PermissionHandler(Handler next) {
      98. super(next);
      99. }
      100. @Override
      101. boolean process(Request request) {
      102. System.out.println("请入权限验证阶段!");
      103. if (request.isPermission()) {
      104. System.out.println("权限验证通过,允许访问!");
      105. Handler next = getNext();
      106. if (null == next) {
      107. return true;
      108. } else return next.process(request);
      109. }
      110. System.out.println("权限验证失败!");
      111. return false;
      112. }
      113. }
      114. static class containSensitiveWords extends Handler {
      115. public containSensitiveWords() {
      116. super();
      117. }
      118. public containSensitiveWords(Handler next) {
      119. super(next);
      120. }
      121. @Override
      122. boolean process(Request request) {
      123. System.out.println("进入敏感词验证模块");
      124. if (request.isContainSensitiveWords()) {
      125. System.out.println("包含敏感词,拒绝访问!");
      126. return false;
      127. } else {
      128. Handler next = getNext();
      129. if (null == next) {
      130. return true;
      131. }
      132. return next.process(request);
      133. }
      134. }
      135. }
      136. }

      Filter 类型的责任链模式: ```java public class Main { interface Node {

      1. void display(String in, String out, Chain chain);

      }

      static class Chain {

      1. List<Node> chain = new ArrayList<>();
      2. int pos = 0;
      3. public void doFilter(String in, String out) {
      4. if (pos < chain.size()) {
      5. chain.get(pos++).display(in, out, this);
      6. }
      7. }
      8. public void add(Node node) {
      9. chain.add(node);
      10. }

      }

    1. public static void main(String[] args) {
    2. Chain chain = new Chain();
    3. chain.add((s1, s2, c) -> {
    4. s1 += "节点1处理" + "-->";
    5. s2 += "节点1处理" + "-->";
    6. c.doFilter(s1, s2);
    7. });
    8. chain.add((s1, s2, c) -> {
    9. s1 += "节点2处理" + "-->";
    10. s2 += "节点2处理" + "-->";
    11. c.doFilter(s1, s2);
    12. });
    13. chain.doFilter("null", "null");
    14. }

    } ```