1.模式定义:
    为请求创建了一个接收者对象的链。
    如请求频率、登录认证、授权认证、敏感词过滤等操作,就跟gateway网关登录授权过滤判断一样。

    1. class Request{ //这里简单做数据模拟
    2. public boolean isLogin; //是否登录了
    3. public boolean isFrequentOk; //是否符合调用频率
    4. public boolean isToken; //token认证
    5. public Request(boolean isLogin,boolean isFrequentOk,boolean isToken){
    6. this.isLogin = isLogin;
    7. this.isFrequentOk = isFrequentOk;
    8. this.isToken = isToken;
    9. }
    10. }
    11. abstract class Handler{
    12. public Handler next;
    13. public Handler(Handler next) {
    14. this.next = next;
    15. }
    16. abstract boolean process(Request request);
    17. }
    18. class RequestFrequentHandler extends Handler{
    19. public RequestFrequentHandler(Handler next) {
    20. super(next);
    21. }
    22. @Override
    23. boolean process(Request request) {
    24. System.out.println("进行访问频率控制");
    25. if(request.isFrequentOk){
    26. if(next == null){
    27. return true;
    28. }
    29. if(!next.process(request)){
    30. return false;
    31. }
    32. else{
    33. return true;
    34. }
    35. }
    36. return false;
    37. }
    38. }
    39. class LoginHandler extends Handler{
    40. public LoginHandler(Handler next) {
    41. super(next);
    42. }
    43. @Override
    44. boolean process(Request request) {
    45. System.out.println("进行登录判断");
    46. if(request.isLogin){
    47. if(next == null){
    48. return true;
    49. }
    50. if(!next.process(request)){
    51. return false;
    52. }
    53. else{
    54. return true;
    55. }
    56. }
    57. return false;
    58. }
    59. }
    60. class TokenHandler extends Handler{
    61. public TokenHandler(Handler next) {
    62. super(next);
    63. }
    64. @Override
    65. boolean process(Request request) {
    66. System.out.println("进行token认证");
    67. if(request.isToken){
    68. if(next == null){
    69. return true;
    70. }
    71. if(!next.process(request)){
    72. return false;
    73. }
    74. else{
    75. return true;
    76. }
    77. }
    78. return false;
    79. }
    80. }
    81. public class ChainOfResponsibility {
    82. public static void main(String[] args) {
    83. Request request = new Request(true, true, true);
    84. RequestFrequentHandler requestFrequentHandler = new RequestFrequentHandler(new LoginHandler(new TokenHandler(null)));
    85. if(requestFrequentHandler.process(request)){
    86. System.out.println("访问正常");
    87. }else{
    88. System.out.println("访问异常");
    89. }
    90. }
    91. }

    image.png

    2.应用场景:
    一个请求的处理需要多个对象当中的一个或几个协作处理。
    优点:
    1.请求的发送者和接受者解耦
    2.可以控制执行顺序
    3.符合开闭原则和单一职责原则

    3.经典案例
    1javax.servlet.Filter2javax.servlet.FilterChain