• 我用规则引擎实现了消除if语句


    1背景

    我之前写了一篇关于使用注解和策略模式实现数据脱敏功能,其中使用策略模式用来消除if语句,实现业务与条件逻辑的解耦,有利于功能的扩展。

    使用策略模式实现数据脱敏

    👉我用注解和策略模式优雅地实现了数据的脱敏功能

    简单回顾下这篇文章的脱敏功能,原数据:

    1. public UserInfo getUserInfo() {
    2.     UserInfo userInfo = new UserInfo();
    3.     userInfo.setAge(23);
    4.     userInfo.setIdCard("32133458888988771");
    5.     userInfo.setMobile("13456782345");
    6.     userInfo.setNativePlace("北京海定区");
    7.     userInfo.setSex("男");
    8.     userInfo.setUseId(1234567L);
    9.     userInfo.setUseName("爱德华");
    10.     userInfo.setUseNo("11");
    11.     return userInfo;
    12. }

    要求对身份证和手机号实现数据脱敏

    1. @Data
    2. public class UserInfo {
    3.     private Long useId;
    4.     /**
    5.      * 用户编号
    6.      */
    7.     private String useNo;
    8.     /**
    9.      * 用户姓名
    10.      */
    11.     private String useName;
    12.     /**
    13.      * 用户手机号
    14.      */
    15.     @SensitiveInfo(SensitiveType.MOBILE_PHONE)
    16.     private String mobile;
    17.     /**
    18.      * 用户性别
    19.      */
    20.     private String sex;
    21.     /**
    22.      * 用户年龄
    23.      */
    24.     private int age;
    25.     /**
    26.      * 用户籍贯
    27.      */
    28.     private String nativePlace;
    29.     /**
    30.      * 用户身份证
    31.      */
    32.     @SensitiveInfo(SensitiveType.ID_CARD)
    33.     private String idCard;
    34. }

    这里对脱敏的字段标上了脱敏注解。

    脱敏效果

    2使用if语句处理每种类型的脱敏情况

    代码中有用if语句处理各个类型的脱敏,这是一般情况,使用if语句将业务代码与条件代码混到一起,不利于类型的拓展,这个问题上篇文章有讲到。

    解决办法是使用了策略模式消除了if语句。今天我们来使用规则引擎消除if语句,代码案例同样是脱敏功能实现。

    3规则引擎 Easy Rules

    规则引擎就是提供一种可选的计算模型。与通常的命令式模型(由带有条件和循环的命令依次组成)不同,规则引擎基于生产规则系统。这是一组生产规则,每条规则都有一个条件(condition)和一个动作(action)———— 简单地说,可以将其看作是一组if-then语句。

    精妙之处在于规则可以按任何顺序编写,引擎会决定何时使用对顺序有意义的任何方式来计算它们。考虑它的一个好方法是系统运行所有规则,选择条件成立的规则,然后执行相应的操作。

    Easy Rules是一个开源的规则引擎框架,它提供Rule抽象以创建具有条件和动作的规则,并提供RuleEngine API,该API通过一组规则运行以评估条件并执行动作。

    4导入Easy Rules规则引擎Maven包

    1. <!--规则引擎-->
    2. <dependency>
    3.     <groupId>org.jeasy</groupId>
    4.     <artifactId>easy-rules-core</artifactId>
    5.     <version>4.0.0</version>
    6. </dependency>

    5编写规则类

    我们编写了如下的规则类:

    6定义规则接口

    接口用于规范规则方法

    7具体规则类实现举例

    这里在类上定义Rule注解,表明Rule的名称和描述。类里面实现3个方法:

    getCurrentSensitiveType():获取当前的枚举类型

    isCurrentType():规则判断,方法上标上@Condition注解,说明这个方法是规则判断的条件。参数中的@Fact注解,可以将条件方法中的参数传到下面的执行方法中。

    maskingData():执行方法,标上@Action注解,当isCurrentType()为真时,会执行该方法。

    8注册所有规则

    我通过规则接口获取所有的规则实现类实例,然后注意注册到规则引擎中,最后执行规则。我们来看看详细的执行过程。

    想要执行规则,我们首先需要创建一个Fact实例,这个实例用于存储条件判断的参数。

    Fact内部是一个HashSet容器:

    name的值我们可以自定义,value的值是脱敏注解传过来的信息。

    接着需要将Rule实例注册到Rules中,这里我们通过Spring的特性获取到了接口SensitiveRule的所有示例:

    最后执行Rule,当规则满足,就会执行规则定义的方法:

    RuleEntity实体类内容

    1. @Data
    2. @AllArgsConstructor
    3. @NoArgsConstructor
    4. @ToString
    5. public class RuleEntity {
    6.     SensitiveType type;
    7.     String infoStr;
    8. }

    RuleMapService中的map存放处理后的脱敏数据

    1. public class RuleMapService {
    2.     public static Map<StringStringgetMap() {
    3.         return map;
    4.     }
    5.     private static Map<String,String> map = Maps.newHashMap();
    6. }

    调用RuleService#execute方法,处理脱敏数据:

    最后效果:

    我们看到电话号码和身份证信息做了脱敏处理。

    本篇文章简要的介绍如何使用规则引擎消除if语句,实现数据脱敏。关于规则引擎的详细使用可以看看这篇文章:

    [Easy-Rules: Easy Rules 是开源的 Java 规则引擎 (gitee.com)]-(https://gitee.com/mirrors/Easy-Rules)

    关于规则引擎使用代码可以私信我获取。

    如果这篇文章对你有所帮助,欢迎点赞和转发。

  • 相关阅读:
    基于javaweb+mysql的+JPA学生宿舍学生住宿申请管理系统(管理员、学生)
    众和策略:题材股什么意思?
    数据可视化在监控易中的艺术与实践
    台灯显色指数多少好?护眼台灯该这样选择
    圈复杂度 - 软件工具
    双碳时代下,数据中心PUE划红线
    [密码学入门]凯撒密码(Caesar Cipher)
    初入职场必备丨二进制面试问题汇总
    14 WEB漏洞:SQL注入之类型及提交注入
    代码随想录算法训练营 动态规划part07
  • 原文地址:https://blog.csdn.net/wujialv/article/details/126436663