深入理解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);
}
}
我们可以看到,请求A被ConcreteHandlerA处理了,请求B被ConcreteHandlerB处理,请求C又被ConcreteHandlerA处理.这是因为我们将ConcreteHandlerA和ConcreteHandlerB连接成了一个责任链,请求会依次被传递给每个处理器,直到有一个处理器能够处理它为止.如果没有任何处理器能够处理请求,请求将被忽略.
总结
优点
解耦性强:责任链模式能够将请求者和处理者解耦,请求者无需知道请求的处理者是谁,处理者也无需知道请求的发送者是谁,从而降低了系统的耦合度
可扩展性强:责任链模式可以动态地增加,修改,删除请求的处理者,系统的灵活性和可扩展性得到了增强
代码可读性高:责任链模式能够将请求处理流程分解为多个小的处理单元,可以避免复杂的if-else嵌套,使得代码更加清晰易读.
缺点
可能会造成性能问题:当责任链中的处理者过多或处理的任务比较耗时时,可能会造成性能问题.
请求处理不一定会被处理:如果没有处理者处理某个请求,那么该请求就会别丢弃,无法得到处理,可能会导致系统异常或出错.
应用场景
请求需要被多个对象处理:当一个请求需要被多个对象处理时,可以使用责任链模式.例如:一个事件发生后需要经过多个对象处理,这些对象可以组成责任链,按顺序处理该事件.
请求需要按顺序被处理:当一个请求需要按照一定的顺序被处理时,可以使用责任链模式.例如:多个对象需要按照某个顺序依次处理请求,这些对象可以组成责任链,按顺序处理请求.
动态添加请求处理者:当需要动态添加,删除或修改请求处理者时,可以使用责任链模式.例如:需要动态地修改请求处理流程,可以通过修改责任链中的处理者来实现.
需要避免请求发送者和接收者之间的耦合关系:当需要避免请求发送者和接收者之间的耦合关系时,可以使用责任链模式.例如:需要将请求发送者和接收者解耦,使得系统更加灵活,可扩展.
来源:https://blog.csdn.net/qq_43135259/article/details/129529339


猜你喜欢
- RestTemplate反序列化嵌套对象假设某个接口返回的数据如下格式{ "msg" : "ok&
- Java中数组初始化和OC其实是一样的,分为动态初始化和静态初始化,动态初始化:指定长度,由系统给出初始化值静态初始化:给出初始化值,由系统
- 初识LinkedHashMap大多数情况下,只要不涉及线程安全问题,Map基本都可以使用HashMap,不过HashMap有一个问题,就是迭
- 一.介绍Apache Shiro是Java的一个安全框架。目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring
- 本文实例为大家分享了Spring boot实现文件上传的具体代码,供大家参考,具体内容如下1. 创建一个Maven的web工程,然后配置po
- GridView是类似于ListView的控件,只是GridView可以使用多个列来呈现内容,而ListView是以行为单位,所以用法上是差
- launch我们经常用,今天来看看它是什么原理。建议: 食用本篇文章之前记得先食用Kotlin协程之createCoroutine和star
- 上篇文章我们已经可以在 Grafana 上看到对应的 SpringBoot 应用信息了,通过这些信息我们可以对 SpringBoot 应用有
- 前言最近写了篇有关Eclipse工程转Android Studio工程的文章,而导致公司项目需要转 AS 的直接原因,就是今天要写的主题–方
- 本文实例讲述了Java删除二叉搜索树的任意元素的方法。分享给大家供大家参考,具体如下:一.删除思路分析在删除二叉搜索树的任意元素时,会有三种
- 提到java里的注解,和我们平时的注释还是有很大的区别,主要是作为java特性来使用的,跟我们常见的类是同一个使用的层面。关于java注解的
- 核心思想:“分”与“合”。主体流程先将一个序列分成很多个不能再分割的子序列,将各个子序列分别排序后再将子序列合并。其实就是重复两个步骤:【1
- 现象在android开发中,经常会需要替换res\drawable中的图片,打开res\layout下的文件预览布局页面发现图片已经被替换,
- 在使用springMVC框架构建web应用,客户端常会请求字符串、整型、json等格式的数据,通常使用@ResponseBody注解使 co
- 一、项目简述本系统功能包括:数据统计、收件录入、发件录入、到件录入、派件录入、问题件录入、退件录入、留仓录入、装车录入、发车录入、到车录入、
- 目录Java反射超详解1.反射基础1.1Class类1.2类加载2.反射的使用2.1Class对象的获取 2.2Construct
- Android Rreact Native 常见错误总结 1.invariant violation:expecte
- Android实现TextView超链接一共有五种方式:推荐第四种、第五种1. 直接在xml文件中配置autoLink属性(简单易用,效果单
- 前言:事情是这样的:运营人员反馈,通过Excel导入数据时,有一部分成功了,有一部分未导入。初步猜测,是事务未生效导致的。查看代码,发现导入
- 拼图小游戏,学习阶段。很多不足,改进了一下演示图片:J_Puzzle.javaimport java.awt.BorderLayout;im