当前位置: 首页 > news >正文

责任链模式

注意:参考学java的生生责任链模式,代码

一.基本框架

在这里插入图片描述
如上图所示,责任链的由节点(实现了ValidatorHandler接口)和主流程(负责组装各个节点)组成.
其实现方式一共有两种:

  1. 数组:如上图所示,在Validator中通过List将各个节点存储起来.
  2. 链表: 在各个节点中存储next,并提供appNext(ValidatorHandler handler)方法供Validator装配使用.

二. 引入上下文

在责任连中引入上下文,对外不可见,只对责任链的主流程和各个节点可见;可以方便存储每个节点过滤的信息,同时,也便于对主流程序进行干预

1. 升级1:责任链的所有节点全部执行

需求:在责任链的基本实现中,当前面节点抛出异常,后面节点便不会再执行,如果需要责任链全部执行完然后再抛出全部的异常,如何进行?

方案1:不引入上下文,在主流程中直接捕获异常存储起来,当节点全部执行完毕后,再抛出异常.

public class ValidatorChain {private final List<ValidatorHandler> handlers = new ArrayList<>();public void validate(Object value) {//存储异常信息List<String> list = new ArrayList<>();for (ValidatorHandler handler : handlers) {try {handler.validate(value, context);}catch (ValidatorException e){list.add(e.getMessage());}}if (list.isEmpty()) {return;}throw new ValidatorException(list.toString());}}

方案2:引入上下文,节点不再抛出异常,直接将异常信息存储在上下文中,执行完全部节点后再抛出异常

public class ValidatorContext {private final List<String> errorMessageList = new ArrayList<>();public void appendError(String message) {errorMessageList.add(message);}public void throwExceptionIfNecessary() {if(errorMessageList.isEmpty()){return;}throw new ValidatorException(errorMessageList.toString());}
}
public class ValidatorChain {private final List<ValidatorHandler> handlers = new ArrayList<>();public void validate(Object value) {ValidatorContext context = new ValidatorContext();for (ValidatorHandler handler : handlers) {handler.validate(value, context);if(context.isStopped()){break;}}context.throwExceptionIfNecessary();}}

2. 升级2:节点干预主流程

需求: 在升级1的基础上,如何实现节点控制当主流程的进行?

解决方案:在上下文中引入stopped变量,如果某一个节点想要中断流程,则调用上下文的stopChain()方法,同时在主流程中执行完该节点后取出上下文的stopChain方法判断主流成是否中断

上下文


public class ValidatorContext {private final List<String> errorMessageList = new ArrayList<>();private boolean stopped =false;private int currentIndex = 0;public void stopChain(){this.stopped =true;}public boolean isStopped(){return stopped;}public void throwExceptionIfNecessary() {if(errorMessageList.isEmpty()){return;}throw new ValidatorException(errorMessageList.toString());}}

主流程:

public class ValidatorChain {private final List<ValidatorHandler> handlers = new ArrayList<>();public void validate(Object value) {ValidatorContext context = new ValidatorContext();for (ValidatorHandler handler : handlers) {handler.validate(value, context);if(context.isStopped()){break;}}context.throwExceptionIfNecessary()}public void addLastHandler(ValidatorHandler handler) {this.handlers.add(handler);}
}

节点:

public class MaxValidatorHandler  implements ValidatorHandler{private final int max;public MaxValidatorHandler(int max) {this.max = max;}@Overridepublic void validate(Object value,ValidatorContext context) {if(value instanceof Integer integerValue){if(integerValue > max){context.appendError("你的值是"+ integerValue+ "不能大于"+max);context.stopChain();}}}
}
http://www.lqws.cn/news/485443.html

相关文章:

  • SQL Server基础语句4:数据定义
  • C++ 特有模式深度解析:Pimpl惯用法与CRTP
  • 0-机器学习简介
  • python高校教务管理系统
  • Hologres的Table Group和Shard简介
  • LangChain赋能RAG:从构建到评估优化的一体化实战指南
  • CSS 调整文字方向
  • 在高数中 导数 微分 不定积分 定积分 的意义以及联系
  • 【数据结构】_二叉树部分特征统计
  • 【期末速成】编译原理
  • 微处理器原理与应用篇---常见基础知识(2)
  • (C++)素数的判断(C++教学)(C语言)
  • LLM大模型存储记忆功能:技术原理与应用实践
  • 445场周赛
  • 线程池异步处理
  • 使用模板创建uniapp提示未关联uniCloud问题
  • 云侧工程云函数开发
  • AIGC技术的本质:统计学驱动的智能革命
  • react-route-dom@6
  • 深入剖析Flink内存管理:架构、调优与实战指南
  • SQL Server 基础语句3: 数据操作(插入、删除、更新表)与数据类型
  • 2025-06-22 思考-人的意识与不断走向死亡的过程
  • 如何仅用AI开发完整的小程序<6>—让AI对视觉效果进行升级
  • Linux 文件 I/O 与标准 I/O 缓冲机制详解
  • 21.安卓逆向2-frida hook技术-HookOkHttp的拦截器
  • 前端手写题(一)
  • UMAP:用于降维的均匀流形近似和投影实验
  • CSS 逐帧动画
  • JMeter API 并发性能测试计划JMX文件解析
  • Python 的内置函数 hex