首页 > 其他分享 >每周一个技能点:责任链模式实现数据多重校验

每周一个技能点:责任链模式实现数据多重校验

时间:2024-07-06 17:57:57浏览次数:19  
标签:多重 校验 AbstractHandler 处理器 user 节点 next public 技能

定义:

责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿着这条链传递该请求。

原始概念中,是直到链上的某个接收对象能够处理它为止。

实际使用中,链上的所有对象都可以对请求进行特殊处理。

代码:

定义接口:

public interface Handler {
    public void exec(User user);
}

定义抽象类继承接口,并且在抽象类中编写公共方法

public abstract class AbstractHandler implements Handler {

    public AbstractHandler next;


    public void  next(AbstractHandler next){
        this.next = next;
    }
    

    public static Builder builder(){
        return new Builder();
    }

    public static class Builder{
        private AbstractHandler head;
        private AbstractHandler tail;


        public Builder addHandler(AbstractHandler handler){
            //如果头节点是空,赋值处理器
            if (this.head == null){
                this.head = handler;
                this.tail = handler;
                return this;
            }
            //头节点不是空,将传来的处理器赋值个上一个节点d的next
            this.tail.next(handler);
            //将传来的处理器加到尾部,以便于下一个处理器在进行处理
            this.tail = handler;
            return this;
        }

        public AbstractHandler build(){
           return this.head;
        }
    }

}

定义具体校验规则:

public class NameHandler extends AbstractHandler {


    @Override
    public void exec(User user) {
        if (user.getName() == null){
            System.out.println("用户名是空");
            return;
        }
        if (next != null){
            next.exec(user);
        }
    }
}
public class PassWordHandler extends AbstractHandler {
    @Override
    public void exec(User user) {
        if (user.getPassWord() == null || !Objects.equals(user.getPassWord(),"666")){
            System.out.println("密码不正确");
        }

    }
}

测试

public class HandlerTest {
    public static void main(String[] args) {

        /**
         * 责任链模式进行数据多重校验,根据处理器的构造顺序进行顺序校验
         * 还可以应用于处理不同类型的数,user中存在type,根据type进行判断再某一个节点,如果再此节点进行小狐狸
         * 不在此节点进行下一节点处理,知道招找到处理器处理
         */


        User user = new User();
        user.setName("zs");
        user.setPassWord("111");

        Handler build = AbstractHandler.builder()
                .addHandler(new NameHandler())
                .addHandler(new PassWordHandler())
                .build();
        build.exec(user);
    }
}

扩展使用:

除了校验,还可以用于根据接受数据不同类型的分别在不同类中处理相应的数据

比如事件处理系统:在一个事件驱动的系统中,可能需要对不同类型的事件进行不同 的处理。责任链模式可以用来创建一个事件处理器链,每个处理器负责处理特定 类型的事件,并将事件传递给下一个处理器。这样可以确保系统的可扩展性和灵 活性。

结合springBoot应用:

将构建加入到配置类中:

 Handler build = AbstractHandler.builder()
                .addHandler(new NameHandler())
                .addHandler(new PassWordHandler())
                .build();

使用时候直接从容器中拿到Handler,调用exec()方法即可

标签:多重,校验,AbstractHandler,处理器,user,节点,next,public,技能
From: https://blog.csdn.net/m0_73363097/article/details/140076634

相关文章

  • 反码求和 校验和算法
    参考链接问题引出最近在学习ICMP时,看到里面有关于校验和的算法一知半解。校验和是16bit字的二进制反码和,也觉得很奇怪,为什么会用反码和,而不是直接求和呢?或者是补码和呢?如果计算机中存储数据使用原码,则会导致两个问题,1.有负数参与的运算结果不正确。2.0的表示方法有两种。......
  • 数据特征采样在 MySQL 同步一致性校验中的实践
    作者:vivo互联网存储研发团队-ShangYongxing本文介绍了当前DTS应用中,MySQL数据同步使用到的数据一致性校验工具,并对它的实现思路进行分享。一、背景在MySQL的使用过程中,经常会因为如集群拆分、数据传输、数据聚合等原因产生流动和数据复制。而在通常的数据复制过程中,因......
  • csrf跨站请求,钓鱼网站实现示例,CSRF校验,CSRF相关装饰器,Auth模块,扩展Auth表
    ⅠDjango框架之csrf跨站请求【一】跨站请求伪造介绍【1】引入CSRF(Cross-SiteRequestForgery)跨站请求伪造是一种常见的网络攻击方式。攻击者通过诱导受害者访问恶意网站或点击恶意链接将恶意请求发送到目标网站上利用受害者在目标网站中已登录的身份来执行某些操作从而......
  • 学习JVM需要掌握这些技能
    最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天努力算是整理出来了。希望对大家有所帮助。JDK是什么?JDK是用于支持Java程序开发的最小环境。Java程序设计语言Java虚拟机JavaAPI类库JRE是什么?JRE是支持Java程序运行的标准环境。JavaSEAPI子集Java虚拟......
  • .Net知识技能大全
    .Net知识技能大全更多请见https://www.dotnetshare.comC#常见运算符一元运算符(+、-、!、~、++、--)算术运算符(*、/、%、+、–)移位运算符(<<、>>)关系和类型测试运算符(==、!=、<、>、<=、>=、is和as)逻辑运算符(&、^和|)条件逻辑运算符(&&和||)空合并运算符(??)条件运......
  • 鸿蒙手机号&&验证码登录, 包含倒计时&&号码格式验证码格式校验, 还有 使用 Hyperlink
    1,先看看整体效果                          2,看格式校验效果                            3,代码直接CV  importpromptActionfrom'@ohos.promptA......
  • 校验IP地址格式:IPv4、IPv6、IP/掩码和IP段
    校验IP地址格式:IPv4、IPv6、IP/掩码和IP段https://www.jianshu.com/p/95d51e51cc2eIPv4格式验证IPv4是32位地址,由四个十进制数(0-255)组成,以点分隔。以下是一个IPv4地址的示例:192.168.0.1。要验证输入是否符合IPv4格式,我们可以使用正则表达式进行匹配。下面是一个JavaScript......
  • 2024年全国职业院校技能大赛移动应用设计与开发赛项(01卷)
    竞赛说明一、竞赛主题21 世纪以来,随着各项科技迅猛发展,多元化技术革命创新正在给我们的衣食住行,带来全新的数字人工智能体验,各行各业都搭乘着技术产业的转型升级,迎来高速发展时期。“十四五”规划和党的二十大强调了推动战略性新兴产业发展的重要性,战略性新兴产......
  • kettle从入门到精通 第七十四课 ETL之kettle kettle调用https接口教程,忽略SSL校验
    场景:kettle调用https接口,跳过校验SSL。(有些公司内部系统之间的https的接口是没有SSL校验这一说,无需使用用证书的) 解决方案:自定义插件或者自定义jar包通过javascript调用https接口。1、httppost步骤调用https接口,无法通过ssl安全校验,如下图所示:查看了kettle源码之后该步骤......
  • springboot项目登陆校验————基于Jwt令牌和Fliter / Interceptor
    springboot项目登陆校验————基于Jwt令牌和Fliter/Interceptor文章目录springboot项目登陆校验————基于Jwt令牌和Fliter/Interceptor1.概述2.Jwt令牌2.1Jwt令牌的组成2.2Jwt登录认证流程2.3代码实现3.方法1:Fliter过滤器3.1简介3.1代码实现4.方法2:Interce......