深入理解Java责任链模式实现灵活的请求处理流程

作者:.番茄炒蛋 时间:2022-06-06 23:33:53 

介绍

责任链模式是一种行为型设计模式,其目的是将请求从一个对象传递到另一个对象,直到找到能够处理该请求的对象为止.再责任链模式中,每个对象都持有对下一个对象的引用,形成一个链条.当一个请求进入这个链条时,每个对象一次判断是否有能力处理该请求,如果有,就处理该请求,如果没有就将请求传递给下一个对象.这样,直到找到能够处理该请求的对象为止,或者请求无法被任何对象处理时,责任链模式才结束.

实现

请求类型枚举

public enum RequestType {
   TYPE_A,
   TYPE_B
}

请求类

@Data
public class Request {
   private RequestType requestType;
   private String content;
   public Request(RequestType requestType, String content) {
       this.requestType = requestType;
       this.content = content;
   }
}

抽象处理类

@Data
public abstract class Handler {
   protected Handler nextHandler;
   /**
    * 处理请求的方法
    *
    * @param request
    */
   public abstract void handle(Request request);
}

具体处理类

public class ConcreteHandlerA extends Handler {
   /**
    * 处理请求的方法
    *
    * @param request
    */
   @Override
   public void handle(Request request) {
       if (request.getRequestType() == RequestType.TYPE_A) {
           // 处理请求
           System.out.println("ConcreteHandlerA 处理了请求:" + request.getContent());
       }else {
           // 将请求传递给下一个处理器
           if (nextHandler != null){
               nextHandler.handle(request);
           }
       }
   }
}
public class ConcreteHandlerB extends Handler{
   /**
    * 处理请求的方法
    *
    * @param request
    */
   @Override
   public void handle(Request request) {
       if (request.getRequestType() == RequestType.TYPE_B) {
           // 处理请求
           System.out.println("ConcreteHandlerB 处理了请求:" + request.getContent());
       }else {
           // 将请求传递给下一个处理器
           if (nextHandler != null){
               nextHandler.handle(request);
           }
       }
   }
}

测试

public class Demo {
   public static void main(String[] args) {
       // 创建责任链
       Handler handlerA = new ConcreteHandlerA();
       Handler handlerB = new ConcreteHandlerB();
       handlerA.setNextHandler(handlerB);
       // 发送请求
       Request request1 = new Request(RequestType.TYPE_A,"请求A");
       handlerA.handle(request1);
       Request request2 = new Request(RequestType.TYPE_B,"请求B");
       handlerA.handle(request2);
       Request request3 = new Request(RequestType.TYPE_A,"请求C");
       handlerA.handle(request3);
   }
}

深入理解Java责任链模式实现灵活的请求处理流程

我们可以看到,请求A被ConcreteHandlerA处理了,请求B被ConcreteHandlerB处理,请求C又被ConcreteHandlerA处理.这是因为我们将ConcreteHandlerA和ConcreteHandlerB连接成了一个责任链,请求会依次被传递给每个处理器,直到有一个处理器能够处理它为止.如果没有任何处理器能够处理请求,请求将被忽略.

总结

优点

  • 解耦性强:责任链模式能够将请求者和处理者解耦,请求者无需知道请求的处理者是谁,处理者也无需知道请求的发送者是谁,从而降低了系统的耦合度

  • 可扩展性强:责任链模式可以动态地增加,修改,删除请求的处理者,系统的灵活性和可扩展性得到了增强

  • 代码可读性高:责任链模式能够将请求处理流程分解为多个小的处理单元,可以避免复杂的if-else嵌套,使得代码更加清晰易读.

缺点

  • 可能会造成性能问题:当责任链中的处理者过多或处理的任务比较耗时时,可能会造成性能问题.

  • 请求处理不一定会被处理:如果没有处理者处理某个请求,那么该请求就会别丢弃,无法得到处理,可能会导致系统异常或出错.

应用场景

  • 请求需要被多个对象处理:当一个请求需要被多个对象处理时,可以使用责任链模式.例如:一个事件发生后需要经过多个对象处理,这些对象可以组成责任链,按顺序处理该事件.

  • 请求需要按顺序被处理:当一个请求需要按照一定的顺序被处理时,可以使用责任链模式.例如:多个对象需要按照某个顺序依次处理请求,这些对象可以组成责任链,按顺序处理请求.

  • 动态添加请求处理者:当需要动态添加,删除或修改请求处理者时,可以使用责任链模式.例如:需要动态地修改请求处理流程,可以通过修改责任链中的处理者来实现.

  • 需要避免请求发送者和接收者之间的耦合关系:当需要避免请求发送者和接收者之间的耦合关系时,可以使用责任链模式.例如:需要将请求发送者和接收者解耦,使得系统更加灵活,可扩展.

来源:https://blog.csdn.net/qq_43135259/article/details/129529339

标签:Java,责任链模式,设计模式
0
投稿

猜你喜欢

  • Java如何把数组转换为ArrayList

    2021-08-14 19:59:45
  • 关于Android实现简单的微信朋友圈分享功能

    2021-07-01 16:49:49
  • C#实现简单学生成绩管理系统

    2023-03-14 01:50:22
  • C#读写操作app.config中的数据应用介绍

    2021-07-25 21:33:19
  • C#实现文件上传与下载功能实例

    2022-11-18 07:59:03
  • C# 使用相同权限调用 cmd 传入命令的方法

    2023-06-01 23:36:45
  • c#高效的线程安全队列ConcurrentQueue<T>的实现

    2021-07-27 11:01:05
  • 最小树形图模板朱刘算法分享

    2023-11-07 07:04:38
  • 使用fileupload组件实现文件上传功能

    2023-05-04 02:48:06
  • Taro打包Android apk过程详解

    2022-01-31 02:55:27
  • Javaweb 定时器功能代码实例

    2022-04-07 00:47:20
  • Kotlin类对象class初始化与使用

    2023-08-09 22:00:52
  • Spring Boot启动时调用自己的非web逻辑

    2022-02-15 11:40:10
  • Trie树(字典树)的介绍及Java实现

    2022-06-14 15:38:24
  • Java操作Mongodb数据库实现数据的增删查改功能示例

    2023-11-25 00:02:05
  • Java 二分查找的实现及图例解析

    2023-10-28 11:41:57
  • jdk源码阅读Collection详解

    2022-07-25 08:57:40
  • Java重写equals及hashcode方法流程解析

    2023-10-14 06:53:13
  • 详解Java中HashSet和TreeSet的区别

    2022-01-17 09:47:47
  • Logback动态修改日志级别的方法

    2023-05-30 21:47:01
  • asp之家 软件编程 m.aspxhome.com