关于责任链模式的优雅实现

目录

  • 什么是责任链模式
  • 责任链模式在开发中的应用
  • Java实现示例

什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种常用的设计模式,它为请求创建了一个接收者对象的链。这种模式给予请求者一种将请求发送给一个对象并沿着这条链传递直到有一个对象处理它为止的方式。

责任链模式在开发中的应用

责任链模式在开发中有很多应用场景,例如日志记录、权限验证、过滤器等。它可以将复杂的业务逻辑拆分成多个独立的处理器,每个处理器负责处理特定类型的请求。

Java实现示例

下面是一个使用Java语言实现责任链模式的示例:


public interface Handler<T> {boolean handle(T context);default boolean isAsync() {return false;}default boolean logTrace() {return true;}
}@Slf4j
public class CommonPipeline<T> {private List<Handler<T>> handlers = new LinkedList<>();private ExecutorService executorService;public CommonPipeline(int threadPoolSize) {this.executorService = new ThreadPoolExecutor(threadPoolSize, threadPoolSize * 2, 1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());}public void addHandler(Handler<T> handler) {handlers.add(handler);}

这段代码定义了一个通用的管道类。它包含了一个处理器列表和一个执行器服务。构造函数接受一个线程池大小作为参数,并创建了一个线程池执行器。

管道类还包含了一个addHandler方法,用于向处理器列表中添加处理器。

接下来,让我们看一下管道类的execute方法:

public void execute(T context) {String pipelineId = UUID.randomUUID().toString();long startTime = System.currentTimeMillis();AtomicBoolean fastFail = new AtomicBoolean(false);log.info("Starting pipeline execution. Pipeline ID: " + pipelineId);for (Handler<T> handler : handlers) {if (fastFail.get()) {log.warn("Fast fail triggered. Stopping execution. Pipeline ID: " + pipelineId);break;}if (handler.logTrace()) {log.info("Executing handler: " + handler.getClass() + ". Pipeline ID: " + pipelineId);}try {if (handler.isAsync()) {executorService.submit(() -> {if (!handler.handle(context)) {fastFail.set(true);}});} else {if (!handler.handle(context)) {log.warn("Handler " + handler.getClass().getSimpleName() + " failed. Stopping execution. Pipeline ID: " + pipelineId);fastFail.set(true);break;}}} catch (Exception e) {log.error("An error occurred while executing handler: " + handler.getClass() + ". Pipeline ID: " + pipelineId, e);fastFail.set(true);break;}}

这个方法接受一个上下文对象作为参数,并执行管道中的所有处理器。它首先生成了一个唯一的管道ID,并记录了开始时间。然后,它初始化了一个快速失败标志。

在循环中,该方法遍历所有处理器,并检查快速失败标志是否已经触发。如果触发,则停止执行并退出循环。

对于每个处理器,该方法会检查是否需要记录跟踪信息。如果是,则记录当前正在执行的处理器。

然后,该方法会尝试执行当前处理器。如果处理器是异步的,则使用执行器服务提交任务;否则直接调用handle方法。

如果handle方法返回false,则表示当前处理器执行失败。此时,该方法会根据快速失败标志进行相应操作:如果快速失败标志已经触发,则停止执行并退出循环;否则继续执行下一个处理器。

在这段代码中,我们可以看到异步和快速失败两个重要概念。

异步指的是某些操作可以在后台运行而不阻塞主线程。在这个例子中,如果某个处理器是异步的,则它会被提交到线程池中运行而不阻塞主线程。

快速失败指的是当某个操作失败时立即停止整个流程而不再继续尝试其他操作。在这个例子中,如果某个处理器返回false或抛出异常,则整个管道会立即停止运行而不再尝试其他处理器。

希望这篇博客能够帮助你更好地理解责任链模式。

关于责任链模式的优雅实现相关推荐

  1. 十八:责任链模式:优雅的任务分派

    a. 责任链模式剖析 责任链模式是一种行为设计模式,它能够将请求的发送者与接收者解耦.在这个模式中,多个处理对象组成一个链条,每个处理对象在链条中都有机会处理请求.当一个请求沿着链条传递时,处理对象可 ...

  2. 责任链模式:优雅地处理请求的设计模式

    责任链模式是一种行为型设计模式,它允许多个对象依次处理同一个请求,从而避免请求的发送者和接收者之间的耦合关系.在责任链模式中,每个处理者都有机会处理请求,直到请求被处理完成或者到达链的末尾.本文将详细 ...

  3. 巧用『责任链模式』来优化 参数多重校验,非常优雅!

    点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...

  4. 最近学习了责任链模式

    2019独角兽企业重金招聘Python工程师标准>>> 前言 来菜鸟这个大家庭10个月了,总得来说比较融入了环境,同时在忙碌的工作中也深感技术积累不够,在优秀的人身边工作必须更加花时 ...

  5. 面试官:什么是责任链模式?

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 最近在看项目代码的时候发现「责任链模式」,于是想 ...

  6. Java设计模式8,校验、审批流程改善神器,责任链模式

    目录 一.责任链模式 二.责任链模式的优缺点 1.优点 2.缺点 三.违背原则方案 1.Programmer实体类 2.数据校验 3.但是,似乎违反了一些设计原则 四.通过责任链模式重构代码 1.链路 ...

  7. Android使用责任链模式处理二维码扫描结果

    众所周知,二维码的扫描结果其实就是一个字符串,我们拿到一个结果需要对内容进行校验,是否是我们需要的信息,然后做一些特殊的处理.比如先判断是不是一个url链接,是则打开这个链接,不是的话进行下一种判断, ...

  8. java责任链模式审批请假_Java设计模式-责任链模式

    Java设计模式-责任链模式 Java版本:jdk1.8 IDE:IDEA 一 前言 本文介绍责任链模式以及Java下的实现. 二 概念 1.什么是责任链模式 责任链模式(Chain of Respo ...

  9. 责任链模式在业务实践中的思考与改进

    文章目录 背景 责任链基本应用 一些小问题: 读扩散问题 膨胀的上下文 消灭"幽灵字段" 大泥球Processor 总结 背景 众所周知,软件开发没有银弹,但总有一些经典的设计模式 ...

最新文章

  1. RBAC基于角色的用户权限管理
  2. MRP Overview
  3. sql能查到数据 dataset对象里面没有值_新零售数据分析报告
  4. linux cal 命令详解
  5. Quartus prime16.0 与modelsim ae 联调
  6. oracle 的基本命令(一)
  7. linux根目录如何改代码,linux怎样修改目录字体颜色
  8. python对投标_batterytender-为Python del API投标-Jason Kölker Module
  9. Transformer的学习
  10. Nuget 管理报repositories.config 访问路径被拒绝 解决办法
  11. 在苹果系统MacOS上安装PowerDesigner16.5
  12. 信道编码技术——卷积码编码与译码
  13. 通过cRIO 9047 USB端口自定义开发周立功CAN盒
  14. Backdoor.Zegost木马病毒分析(一)
  15. Markdown由浅入深
  16. 如何使用Stack Overflow ?
  17. 创维YS代工E900V21E/TY1608-S905l3B-8822CS及7668无线通刷线刷包
  18. 三、docker镜像创建
  19. java毕业生设计在线党建学习平台计算机源码+系统+mysql+调试部署+lw
  20. 毕业设计效果展示:改良的CP-VTON(ICP-VTON)模型

热门文章

  1. IE浏览器右键清理方法
  2. 访问由于凭据无效被拒绝-解决方法
  3. pandas进行one-hot编码
  4. 1亿人在用的腾讯重磅APP停服下架!网友:陪了我6年啊…
  5. eclipse运行python中文乱码处理
  6. oracle 查询 日期 条件,orcale 把日期当作查询条件
  7. PTA——计算存款利息
  8. PQMagic8合并分区,文件打不开,问题解决!》
  9. 街霸对决最新服务器机柜销售,街霸对决值不值得玩,氪度肝度怎么样
  10. 模式识别边肇祺第二章(一)