首页 > 其他分享 >学习记录-责任链模式验证参数

学习记录-责任链模式验证参数

时间:2025-01-19 09:56:41浏览次数:3  
标签:requestParam 记录 验证 mark 责任 abstractChainHandlers 参数 public

学习记录-责任链模式验证参数

1.什么是责任链模式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。这样,发送者无需知道哪个对象将处理请求,所有的处理对象都可以尝试处理请求或将请求传递给链上的下一个对象。

img

2.使用责任链模式的好处

职责单一: 责任链模式可以将每个验证逻辑封装到一个独立的处理器中,每个处理器负责单一的验证职责,符合单一职责原则。

可扩展性: 增加新的验证逻辑时,只需添加新的处理器,而不需要修改现有的代码。

清晰的流程: 将所有验证逻辑组织在一起,使得代码结构更加清晰,易于理解。

3.实现

3.1定义责任链抽象接口

public interface AbstractChainHandler<T> extends Ordered {
​
    /**
     * 执行责任链逻辑
     *
     * @param requestParam 责任链执行入参
     */
    void handler(T requestParam);
​
    /**
     * @return 责任链组件标识
     */
    String mark();
}

3.2创建责任链模式上下文容器

@Component
public final class ChainContext<T> implements ApplicationContextAware, CommandLineRunner {
​
    /**
     * 应用上下文,我们这里通过 Spring IOC 获取 Bean 实例
     */
    private ApplicationContext applicationContext;
    /**
     * 保存商家后管责任链实现类
     * <p>
     * Key:{@link MerchantAdminAbstractChainHandler#mark()}
     * Val:{@link MerchantAdminAbstractChainHandler} 一组责任链实现 Spring Bean 集合
     * <p>
     * 比如有一个优惠券模板创建责任链,实例如下:
     * Key:MERCHANT_ADMIN_CREATE_COUPON_TEMPLATE_KEY
     * Val:
     * - 验证优惠券信息基本参数是否必填 —— 执行器 {@link CouponTemplateCreateParamNotNullChainFilter}
     * - 验证优惠券信息基本参数是否按照格式传递 —— 执行器 {@link CouponTemplateCreateParamBaseVerifyChainFilter}
     * - 验证优惠券信息基本参数是否正确,比如商品数据是否存在等 —— 执行器 {@link CouponTemplateCreateParamVerifyChainFilter}
     * - ......
     */
    private final Map<String, List<AbstractChainHandler>> abstractChainHandlerContainer = new HashMap<>();
​
    /**
     * 责任链组件执行
     *
     * @param mark         责任链组件标识
     * @param requestParam 请求参数
     */
    public void handler(String mark, T requestParam) {
        // 根据 mark 标识从责任链容器中获取一组责任链实现 Bean 集合
        List<AbstractChainHandler> abstractChainHandlers = abstractChainHandlerContainer.get(mark);
        if (CollectionUtils.isEmpty(abstractChainHandlers)) {
            throw new RuntimeException(String.format("[%s] Chain of Responsibility ID is undefined.", mark));
        }
        abstractChainHandlers.forEach(each -> each.handler(requestParam));
    }
​
    @Override
    public void run(String... args) throws Exception {
        // 从 Spring IOC 容器中获取指定接口 Spring Bean 集合
        Map<String, AbstractChainHandler> chainFilterMap = applicationContext.getBeansOfType(AbstractChainHandler.class);
        chainFilterMap.forEach((beanName, bean) -> {
            // 判断 Mark 是否已经存在抽象责任链容器中,如果已经存在直接向集合新增;如果不存在,创建 Mark 和对应的集合
            List<AbstractChainHandler> abstractChainHandlers = abstractChainHandlerContainer.getOrDefault(bean.mark(), new ArrayList<>());
            abstractChainHandlers.add(bean);
            abstractChainHandlerContainer.put(bean.mark(), abstractChainHandlers);
        });
        abstractChainHandlerContainer.forEach((mark, unsortedChainHandlers) -> {
            // 对每个 Mark 对应的责任链实现类集合进行排序,优先级小的在前
            unsortedChainHandlers.sort(Comparator.comparing(Ordered::getOrder));
        });
    }
​
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }
}

3.3使用方式

@Service
@RequiredArgsConstructor
public class ServiceImpl extends ServiceImpl<Mapper, DO> implements Service {
​
    private final ChainContext ChainContext;
  
    @Override
    public void createCouponTemplate(ReqDTO requestParam) {
        // 通过责任链验证请求参数是否正确
       ChainContext.handler(ChainBizMarkEnum.XXXXX.name(), requestParam);
        // xxxxxx
    }
}

标签:requestParam,记录,验证,mark,责任,abstractChainHandlers,参数,public
From: https://blog.csdn.net/sjsjsbbsbsn/article/details/145108352

相关文章

  • FastAPI 依赖注入之类依赖:使用类声明依赖项并简化查询参数
    FastAPI依赖注入之类依赖:使用类声明依赖项并简化查询参数在FastAPI中,依赖注入(DI)不仅支持函数,还支持类作为依赖项,这使得代码更加模块化与易于维护。通过类依赖,开发者能够封装复杂的业务逻辑与参数验证,提高代码的可复用性与可读性。本文介绍了如何使用类来声明依赖项并应......
  • R 实现英文数字验证码识别
    R的强大扩展生态使其也能完成OCR任务,我们将结合magick包(图像处理)和tesseract包(OCR)来实现。安装所需包在R环境中,安装以下R包:R更多内容访问ttocr.com或联系1436423940install.packages("magick")install.packages("tesseract")R实现代码编写以下R代码来完......
  • Perl 实现英文数字验证码识别
    我们将通过结合TesseractOCR和ImageMagick工具来实现图像处理和文本识别。安装依赖确保已安装以下工具和模块:TesseractOCR:用于文本识别。ImageMagick:用于图像处理。Perl模块:Image::Magick和Tesseract::OCR。在命令行中执行以下命令:bash安装TesseractOCRsudo......
  • MATLAB 实现英文数字验证码识别
    MATLAB是一个强大的数值计算和图像处理工具,结合其内置的图像处理工具箱和OCR功能,可以轻松完成验证码识别任务。前置准备安装MATLAB确保你的MATLAB版本支持OCR功能(通常需要安装ComputerVisionToolbox)。如果没有,先通过MATLAB的工具箱管理器安装该工具箱。准备验......
  • WC 记录
    P1224:给定\(n\)个\(d\)维向量\(A_i\),判断存在\(i,j\)使得\(A_i\)与\(A_j\)的内积为\(k\)的倍数,构造方案。\(n\le10^5,d\le30,k\in\{2,3\}\)。题解:考虑\(k=2\)的情形。构造矩阵\(M=A_1|A_2|...|A_k\),\(E=M\cdotM^T\)那么\(A_i\)与\(A_j\)的内积等于\(E_{......
  • 记录一下双多控开关接法
    实际上双控就是单刀双掷开关,多控就是双刀双掷开关。多控里L1A+L1B是输入的俩个接上级出来的俩根线,LA和LB是反着的接上总有一路能通。输入俩通道输出俩通道所以可以无限串联。 具体如何接可以看正泰的教程:(图也是从这偷的),正泰除了贵倒是蛮好的。不过线头露出来一点点就行,别露出......
  • RK3588+linux系统下交叉编译开发记录
    基础开发路线先用树莓派验证交叉编译可行性,或者直接利用树莓派开发项目树莓派运算速度不足时考虑一下方案采用windows环境下vscode加cmake实现交叉编译,将可执行文件直接考入RK3588自带的debian系统运行采用套接字通信,可直接用linux下的网络库开发记录24/12/27T......
  • STM32单片机学习记录(1.17)
    一、STM32        10.3- I2C通信外设        1. I2C外设简介        (1)STM32内部集成了硬件I2C收发电路,可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能,减轻CPU的负担;        (2)支持......
  • sqoop--help--传入参数import
    [root@master~]#sqoophelpimport25/01/1818:36:06INFOsqoop.Sqoop:RunningSqoopversion:1.4.7usage:sqoopimport[GENERIC-ARGS][TOOL-ARGS]Commonarguments:--connect<jdbc-uri>SpecifyJDBC......
  • 1月省选联考做题记录
    CF1434EAConvexGametag:DP,交换值域,博弈论,凸性。首先,由于每组数是分开考虑的,题目可以看作一个组合游戏,也就是说我们可以分开考虑每个游戏的SG值。对于每一组游戏,套路地考虑构建一个有向图模型。注意到每一步的选择与差是有关的,考虑记录\(f_{i,j}\)为,现在\(b\)数组的最后......