基于java实现责任链进行参数校验

这篇具有很好参考价值的文章主要介绍了基于java实现责任链进行参数校验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

责任链是什么

在Java中,责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许对象以链式的方式组织起来,以便请求可以在链中传递,直到被某个对象处理为止。这种模式为多个对象处理同一请求提供了灵活的机制,并且可以将请求的处理者与请求的发送者解耦。

责任链优点

降低耦合度:该模式将请求的发送者和多个请求处理者解耦,发送者只需要将请求发送到链上,而不需要知道具体是哪个对象处理了请求。

增强系统的可扩展性:你可以很容易地添加新的请求处理者到链中,而不需要修改现有的代码。

灵活性:每个处理者都可以独立地决定是否处理请求,或者将请求传递给链中的下一个处理者。

避免多重条件判断:如果没有使用责任链模式,我们可能会使用多重if-else或者switch-case语句来根据条件判断请求应该由哪个处理者处理。这会导致代码的可读性和可维护性下降。而使用责任链模式,可以避免这种复杂的多重条件判断。

责任链使用场景

责任链模式在工作中的具体使用场景非常广泛,
在一些开源框架源码中,比如sentinel,gateway都应用了责任链模式,它特别适用于那些需要动态确定请求处理者、处理者不明确或处理者集合需要动态指定的场景。以下是一些实际工作中的使用场景示例:

审批流程:在一个复杂的审批系统中,一个请求可能需要经过多个审批人员或部门的审批。每个审批人员或部门都可以看作责任链中的一个节点,他们根据各自的职责和规则来处理请求,直到请求被批准或拒绝。通过责任链模式,可以灵活地配置审批流程,并动态地添加、删除或修改审批节点。

权限校验:在权限管理系统中,当用户尝试访问某个资源或执行某个操作时,需要进行权限校验。责任链模式可以将不同的权限校验逻辑封装到不同的处理器中,并按照一定的顺序组成责任链。每个处理器可以根据用户的角色、权限等信息来判断是否允许访问或执行操作。这样,可以方便地添加新的权限校验规则或修改现有的规则。

任务分发:在分布式系统中,任务分发是一个重要的环节。责任链模式可以用于将任务按照一定的规则和顺序分发给不同的处理节点。每个处理节点可以看作责任链中的一个处理器,它们根据任务的类型、优先级、负载情况等因素来决定是否接受任务并进行处理。这种方式可以提高系统的吞吐量和响应速度,实现任务的动态均衡分配。

事件处理:在事件驱动的系统中,当某个事件发生时,需要触发相应的处理逻辑。责任链模式可以将不同的事件处理逻辑封装到不同的处理器中,并按照一定的顺序组成责任链。当事件发生时,它会沿着责任链传递,直到找到能够处理该事件的处理器为止。这种方式可以灵活地处理各种事件,并实现事件的动态扩展和配置。

插件式架构:在插件式架构中,不同的插件可以提供不同的功能或服务。责任链模式可以用于将插件按照一定的顺序连接起来,形成一个功能强大的处理链。每个插件可以看作责任链中的一个处理器,它们根据请求的类型和内容来执行相应的操作。这种方式可以提高系统的可扩展性和可维护性,方便添加新的插件或修改现有的插件。

总的来说,责任链模式在工作中可以帮助我们实现请求的动态处理和灵活的扩展,提高系统的可维护性和可扩展性。它可以应用于各种需要动态确定处理者、处理者不明确或处理者集合需要动态指定的场景,为复杂系统的设计和实现提供了有力的支持。

责任链实现细节

项目布局
基于java实现责任链进行参数校验,责任链模式,设计模式
AbstractChain

package com.goods.chain;

import lombok.extern.slf4j.Slf4j;

import java.util.function.Predicate;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 11:23
 * @Description: AbstractChain
 * @Version: 1.0
 **/
@Slf4j
public abstract class AbstractChain<T> implements Predicate<T> {

    public abstract boolean validate(T o);

    @Override
    public boolean test(T o) {
        if (validate(o)) {
            return true;
        } else {
            log.error("被规则类『" + this.getClass().getCanonicalName() + "』过滤住了!");
        }
        return false;
    }
}

AddressChain

package com.goods.chain;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 11:13
 * @Description: SecondChain
 * @Version: 1.0
 **/
@Slf4j
@Component
@Order(2)
public class AddressChain extends AbstractChain<GoodsDto> {
    @Override
    public boolean validate(GoodsDto dto) {
        if(StringUtils.isBlank(dto.getAddress())){
            log.error("收货地址不能为空!");
            return false;
        }
        return true;
    }
}

ChainClient

package com.goods.chain;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.BooleanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 23:43
 * @Description: ChainClient
 * @Version: 1.0
 **/
@Slf4j
@Component
public class ChainClient {

    @Autowired
    private List<AbstractChain<GoodsDto>> chainList;

    public boolean handleChain(GoodsDto dto) {
        boolean result = true;
        for (AbstractChain<GoodsDto> chain : chainList){
            if(BooleanUtils.isFalse(chain.test(dto))){
                result = false;
                break;
            }
        }
        return result;
    }
}

DiscountChain

package com.goods.chain;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 11:12
 * @Description: FirstChain
 * @Version: 1.0
 **/
@Slf4j
@Component
@Order(1)
public class DiscountChain extends AbstractChain<GoodsDto> {
    @Override
    public boolean validate(GoodsDto dto) {
        if(Objects.nonNull(dto.getDiscount()) && dto.getDiscount() <1){
            log.error("折扣小于1折,校验失败!");
            return false;
        }
        return true;
    }
}

GoodsDto

package com.goods.chain;

import lombok.Builder;
import lombok.Data;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 18:36
 * @Description: GoodsDTO 商品skuDTO
 * @Version: 1.0
 **/
@Data
@Builder
public class GoodsDto {

    /**
     * 商品名称
     */
    private String goodsName;

    /**
     * 商品价格,单位分
     */
    private Long price;

    /**
     * 下单数量
     */
    private Integer count;

    /**
     * 重量,单位g
     */
    private Integer weight;

    /**
     * 收货地址
     */
    private String address;

    /**
     * 折扣
     */
    private Integer discount;

}

PriceChain

package com.goods.chain;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Objects;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 11:14
 * @Description: ThirdChain
 * @Version: 1.0
 **/
@Slf4j
@Component
@Order(3)
public class PriceChain extends AbstractChain<GoodsDto> {
    @Override
    public boolean validate(GoodsDto dto) {
        if (Objects.isNull(dto.getPrice()) || dto.getPrice() < 1L) {
            log.error("商品定价不能为空或小于1分钱!");
            return false;
        }
        return true;
    }
}

TestController

package com.goods.chain;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Copyright 2022 skyworth
 *
 * @Author: wuhao
 * @CreateTime: 2024-04-23 11:15
 * @Description: Test
 * @Version: 1.0
 **/
@Slf4j
@RestController
public class TestController {
    @Autowired
    private ChainClient chainClient;

    /**
     * 责任链测试
     * @return
     */
    @RequestMapping("/test/chain")
    public String testChain() {
        GoodsDto dto = GoodsDto.builder()
                .weight(100)
                .goodsName("macBookPro")
                .address("北京市朝阳区亮马桥汇佳大厦")
                .price(0L)
                .count(1)
                .discount(1)
                .build();
        boolean result = chainClient.handleChain(dto);
        log.info("责任链执行完成,校验结果:{}",result);
        return "hello";
    }
}

模拟使用的场景
基于java实现责任链进行参数校验,责任链模式,设计模式文章来源地址https://www.toymoban.com/news/detail-858492.html

到了这里,关于基于java实现责任链进行参数校验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 设计模式】行为型之责任链模式

    责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,用于将请求发送者和接收者解耦,使得多个对象都有机会处理请求。责任链模式通过创建一个处理请求的链,将请求沿着链传递,直到有一个对象能够处理为止。在本文中,我们将深入研究Java中责任链模式的定

    2024年01月24日
    浏览(49)
  • 【玩转23种Java设计模式】行为型模式篇:责任链模式

    软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接:【玩转23种Java设计模式】学习目录汇总

    2024年02月13日
    浏览(34)
  • Java设计模式—责任链模式(Chin of Responsibility)

    目录 前言 一、责任链模式的简介 二、责任链模式的概念 三、责任链模式的作用 四、责任链模式的优、缺点 1.责任链模式的优点 2.责任链模式的缺点 五、责任链模式的应用场景 六、代码案例 UML类图  1.定义一个请求枚举类  2.定义一个请求类 3.定义一个抽象处理接口 4、定

    2024年02月08日
    浏览(34)
  • Java设计模式-责任链(Chain of Responsibility)模式

    Java责任链(Chain of Responsibility)设计模式是指很多处理对象构成一个链,链中前一个对象指向后一个对象。请求在链中传递,一个请求可以被一个或者多个对象处理。调用方(即客户端)不知道请求会被链中的哪个对象处理,所以责任链模式可以方便组织责任链而不影响调用

    2024年02月16日
    浏览(45)
  • 【设计模式】Java 设计模式之责任链模式(Chain of Responsibility)

    责任链模式(Chain of Responsibility) 一、概述 责任链模式是一种行为设计模式,它允许请求在对象链中传递。每个对象都有机会处理该请求,并且能将其传递给链中的下一个对象。这种模式为请求创建了一个处理对象的链,并沿着这条链传递该请求,直到有一个对象处理它为止

    2024年03月22日
    浏览(42)
  • 设计模式之责任链模式(二): 实现方式

    C++设计模式专栏: 相关文章系列 设计模式之责任链模式(一)-CSDN博客 目录 1.引言 2.实现方式1 3.实现方式2 4.总结                 责任链设计模式(Chain of Responsibiliy DesignPattern)简称职责链模式。在GOF的《设计模式:可复用面向对象软件的基础》中,它是这样定义的:将请求的

    2024年04月27日
    浏览(32)
  • Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

            在平时的开发中,涉及到设计模式的有两块内容,第一个是我们 平时使用的框架 (比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。         面试官一般比较关心的是你在开发过程中, 有没有使用过设计模式,或者你在简历上写了关于设计

    2024年02月10日
    浏览(56)
  • Java设计模式之责任链模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设计模式之责任链模式 OA系统采购审批需求 传统方案解决OA系

    2024年02月06日
    浏览(40)
  • Java设计模式之行为型-责任链模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、在Java中实现 4.2、在SpringBoot中实现  五、总结  责任链模式是一种行为设计模式,它允许你将请求沿着处理者链进行发送。请求会被链上每个处理者处理,直到请求被处理完毕。该模式主要解决的是请求的发送者和

    2024年02月15日
    浏览(39)
  • Java设计模式-策略模式-基于Spring实现

    策略模式是一种行为设计模式,它允许在运行时选择算法的行为。它将算法封装在 独立的策略类 中,使得它们可以相互替换,而不影响客户端代码。这种模式通过 将算法的选择从客户端代码中分离出来 ,提供了更大的灵活性和可维护性。 在Java中,策略模式的设计理念可以

    2024年02月08日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包