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

1背景

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

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

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

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

public UserInfo getUserInfo() {
    UserInfo userInfo = new UserInfo();
    userInfo.setAge(23);
    userInfo.setIdCard("32133458888988771");
    userInfo.setMobile("13456782345");
    userInfo.setNativePlace("北京海定区");
    userInfo.setSex("男");
    userInfo.setUseId(1234567L);
    userInfo.setUseName("爱德华");
    userInfo.setUseNo("11");
    return userInfo;
}

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

@Data
public class UserInfo {
    private Long useId;

    /**
     * 用户编号
     */
    private String useNo;

    /**
     * 用户姓名
     */
    private String useName;

    /**
     * 用户手机号
     */
    @SensitiveInfo(SensitiveType.MOBILE_PHONE)
    private String mobile;

    /**
     * 用户性别
     */
    private String sex;

    /**
     * 用户年龄
     */
    private int age;

    /**
     * 用户籍贯
     */
    private String nativePlace;

    /**
     * 用户身份证
     */
    @SensitiveInfo(SensitiveType.ID_CARD)
    private String idCard;

}

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

脱敏效果

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

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

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

3规则引擎 Easy Rules

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

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

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

4导入Easy Rules规则引擎Maven包

<!--规则引擎-->
<dependency>
    <groupId>org.jeasy</groupId>
    <artifactId>easy-rules-core</artifactId>
    <version>4.0.0</version>
</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实体类内容

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class RuleEntity {
    SensitiveType type;
    String infoStr;
}

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

public class RuleMapService {
    public static Map<String, String> getMap() {
        return map;
    }

    private static Map<String,String> map = Maps.newHashMap();
}

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

最后效果:

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值