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

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

点击上方蓝字关注我!



1背景

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

我用规则引擎实现了消除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;

}

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

脱敏效果

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

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

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

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

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

3规则引擎 Easy Rules

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

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

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

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编写规则类

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

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

6定义规则接口

接口用于规范规则方法

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

7具体规则类实现举例

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

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

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

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

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

8注册所有规则

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

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

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

Fact内部是一个HashSet容器:

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

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

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

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

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

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

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语句

最后效果:

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

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

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

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

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

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




往期推荐




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

扫码二维码

获取更多精彩

Lvshen_9

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

原文始发于微信公众号(Lvshen的技术小屋):我用规则引擎实现了消除if语句

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/261985.html

(0)
Java朝阳的头像Java朝阳

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!