Drools規則引擎-爲什麼使用規則引擎

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失去了作用?

  • 很多地方不能解決規則和業務分離
  • 多數優化方式都不能直接或間接的靈活分配,很多都是利用共性抽離的
  • 規則迭代的時候,優化部分很容易出現牽一髮動全身

規則引擎應用的話,能解決這樣的問題嗎?

  • 規則引擎最大的作用就是靈活的將規則和業務剝離

總結

規則引擎,解決了靈活變更規則不影響具體業務的難點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章