深入理解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
猜你喜欢
- 话不多说,请看代码:package com.lxj.demo;import java.io.BufferedReader;import ja
- 前言青空最近在逛一些社区的时候发现了有很多图片是像素图,感觉挺好玩的。正巧最近自己在学习JavaCV,所以在这里给大家演示一下如何使用Jav
- 星期天小哼和小哈约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。
- 本文实例讲述了C++语言实现线性表之链表实现方法。分享给大家供大家参考。具体分析如下:插入、删除结点的代码有点多,但这样提高了代码的可读性,
- 1. 父工程构建1.1 Maven项目搭建环境版本JDK1.8Maven3.6+Maven模板maven-archetype-size删除父
- 需要用到 java 写一个 ftp 的工具,因为只有一点点 java 基础,但是由于好几年不用,几乎算是不会了,只好一点点来搞,还好能捡起来
- 最近在做的工作要用到本地方法,需要在Java中加载不少动态链接库(以下为方便延用Windows平台下的简写dll,但并不局限于Windows
- 一、注解的概念1、注解官方解释注解叫元数据,一种代码级别的说明,它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举在同一个层次,它可
- 1、抽象类 vs 接口 方法类型: 接口只能有抽象方法。抽象类可以有抽象和非抽象方法。从 Java 8 开始,它也可以有默认和静态
- Condition是在Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean操作。思考:SpringBoo
- 正确使用并行流,避免共享可变状态错用并行流而产生错误的首要原因,就是使用的算法改变了某些共享状态。下面是另一种实现对前n个自然数求和的方法,
- Map接口Map类似y(x)=x;这样的函数(key对应x,value对应y)Map与Collection并列存在。用于保存具有映射关系的数
- java对象拷贝详解及实例Java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:@Testpublic
- 一、使用在非静态方法上public synchronized void syzDemo(){ System.out.print
- 以下摘自胖哥分享的 2022开工福利教程。在学习Spring Security的时候你有没有下面这两个疑问:Spring Security的
- File类简介package com.file;import java.io.File;import java.io.IOException
- 实现的效果图:自定义Fragment继承BottomSheetDialogFragment重写它的三个方法:onCreateDialog()
- 在java中我们常常使用加锁机制来确保线程安全,但是如果过度使用加锁,则可能导致锁顺序死锁。同样,我们使用线程池和信号量来限制对资源的使用,
- Java 本身就自带 JS 引擎,自从 Java 1.6 开始就支持了,愈来愈好。我对 js 比较熟悉,因此有个大胆的想法,为什么不用自带
- 1.基本思路我现阶段的分页查询的实现是基于sql语句的。select * from user where id limit a, b构造出相