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失去了作用?
- 很多地方不能解决规则和业务分离
- 多数优化方式都不能直接或间接的灵活分配,很多都是利用共性抽离的
- 规则迭代的时候,优化部分很容易出现牵一发动全身
规则引擎应用的话,能解决这样的问题吗?
- 规则引擎最大的作用就是灵活的将规则和业务剥离
总结
规则引擎,解决了灵活变更规则不影响具体业务的难点