Drools规则引擎-为什么使用规则引擎

Drools 专栏收录该内容
6 篇文章 0 订阅

echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。


上文我们说过,规则引擎其实就是将if else全部给抽离出来了。但是这就是我们的规则引擎的全部内容吗?规则放在哪里都是放,为什么一定要拿规则引擎来抽离呢?肯定是规则引擎给我们解决了某些问题。本文主要讲的就是规则引擎是解决什么的方案

为什么使用规则引擎?

  • if else需要抽离不是目的
  • 也不是规则引擎有优秀的编码语法

从实例看问题

真实需求分析:新增用户,在新增用户的时候,根据用户的所在地打标记,比如:某用户是北京的,标记北漂,是广州的,标记广漂,依次类推。第一版需求我们看到的代码可能是这样的

if ("上海".equals(people.getAddress())) {
    people.setFlag("上漂");
    peopleServer.insert(people);
}
if ("北京".equals(people.getAddress())) {
    people.setFlag("北漂");
    peopleServer.insert(people);
}
if ("深圳".equals(people.getAddress())) {
    people.setFlag("深漂");
    peopleServer.insert(people);
}
if ("广州".equals(people.getAddress())) {
    people.setFlag("广漂");
    peopleServer.insert(people);
}
...
  • 感觉这些if else很多我们可以提炼一些公共的地方,同时根据规则,我们可以应用策略模式,或者责任链模式,来优化这样的层级结构。

上面的需求版本迭代:领导发现,某一地区的用户很多,比如:北京,如果说北京新增人员全都用北漂来标记,标记出来的用户将近十几万,这样子不利于数据分析和收益转化,于是乎,在北京这个地域的条件上加了个条件,年龄段,18-30标记‘北漂青年’,30-40,‘北漂实力户’等等。看到的代码可能就变成了这样了

if ("上海".equals(people.getAddress())) {
    people.setFlag("上漂");
    peopleServer.insert(people);
}
if ("北京".equals(people.getAddress())) {
    if (people.getAge() > 18 && people.getAge() <= 30) {
        people.setFlag("北漂青年");
        peopleServer.insert(people);
    }
     if (people.getAge() > 30 && people.getAge() < 40) {
        people.setFlag("北漂实力户");
        peopleServer.insert(people);
    }
     ...
}
if ("深圳".equals(people.getAddress())) {
    people.setFlag("深漂");
    peopleServer.insert(people);
}
if ("广州".equals(people.getAddress())) {
    people.setFlag("广漂");
    peopleServer.insert(people);
}
...
  • 当需求变更只有,我们还能使用策略模式吗?还能使用责任链吗?注意到这里就有了一个很重要的问题,我这实例里面为了突出if else这样的规则,省略了业务代码,但是真实的开发当中,我们一般会在if else里面去写很多的对应的业务代码,根据我们的标记,来给用户推送,同时去编写推送策略和推送短信之类的。那再这样的情况下我们的设计模式就不在实用了。最关键的就是如果实用设计模式,整体的代码架构就失去了灵活性,共性的地方太多,如果规则再次变更,要更改的地方太多。

为什么版本迭代让我们的很多方式优化if else失去了作用?

  • 很多地方不能解决规则和业务分离
  • 多数优化方式都不能直接或间接的灵活分配,很多都是利用共性抽离的
  • 规则迭代的时候,优化部分很容易出现牵一发动全身

规则引擎应用的话,能解决这样的问题吗?

  • 规则引擎最大的作用就是灵活的将规则和业务剥离

总结

规则引擎,解决了灵活变更规则不影响具体业务的难点

  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值