用 Java 構建簡單的規則引擎

banq發表於2024-06-03

在軟體開發中,我們經常需要應用一組規則或條件來過濾或處理資料。使用傳統的 if 和 else 語句管理這些規則可能會變得繁瑣且難以維護。規則引擎提供了一種更靈活、更有條理的方法來定義和執行這些規則。在本文中,我們將探討如何使用函數語言程式設計原理在 Java 中構建一個簡單的規則引擎。

先決條件
在我們深入構建規則引擎之前,讓我們先定義必要的元件:

規則:
規則表示我們想要評估的條件或標準。它由一個謂片語成,該謂詞確定給定物件是否滿足規則的標準(使用 Enum 或 Map<key,value> )(在本部分中我使用 enum)。

規則引擎:
規則引擎負責管理一組規則,並將它們應用於一組物件,根據定義的規則對物件進行過濾,並返回過濾結果。

目標物件:
我們將使用一個簡單的 Person 類作為示例物件,我們想使用規則對其進行過濾。它具有姓名和年齡等屬性。

構建規則引擎
讓我們開始一步一步構建我們的規則引擎:

定義規則:我們首先使用名為 Rule 的列舉來定義規則。列舉中的每個規則代表我們要評估的特定條件或標準。例如,在我們的程式碼中,我們定義了兩個規則:AGE_GREATER_THAN_30 和 NAME_STARTS_WITH_B。每個規則都有一個相應的謂詞,用於定義規則的條件。

import java.util.function.Predicate; 

<font>//你可以有很多列舉來管理規則或條件<i>
public  enum  Rule  implements  TestRule { 
    AGE_GREATER_THAN_30(person -> person.getAge() > 30 ), 
    NAME_STARTS_WITH_B(person -> person.getName().startsWith(
"B" )); 

    private  final Predicate<Person> predicate; 

    Rule(Predicate<Person> predicate) { 
        this .predicate = predicate; 
    } 

    public Predicate<Person> getPredicate () { 
        return predicate; 
    } 
}

建立規則引擎:
接下來,我們建立 RuleEngine 類。該類將負責規則的管理和執行。它維護一個規則列表,並提供新增新規則和根據這些規則過濾物件的方法。

實現過濾邏輯
在 RuleEngine 類的 filter 方法中,我們遍歷物件列表並使用 Java 8 Stream API 中的 allMatch 方法應用每條規則。此方法檢查給定物件的所有規則是否都透過。如果所有規則都透過,我們將該物件新增到過濾列表中。

public interface TestRule {
    <T> Predicate<T> getPredicate();
}
import java.util.ArrayList;
import java.util.List;

public class RuleEngine<T> {
    private List<TestRule> rules;

    public RuleEngine() {
        this.rules = new ArrayList<>();
    }

    public void addRule(TestRule rule) {
        rules.add(rule);
    }

    public List<T> filter(List<T> items) {
        List<T> filteredItems = new ArrayList<>();
        for (T item : items) {
            if (rules.stream().allMatch(rule -> rule.getPredicate().test(item))) {
                filteredItems.add(item);
            }
        }
        return filteredItems;
    }
}
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}


最後
在主類中,我們演示了規則引擎的用法。我們建立了一個 Person 物件列表,並用兩條規則初始化了 RuleEngine:AGE_GREATER_THAN_30 和 NAME_STARTS_WITH_B。然後,我們呼叫規則引擎的過濾器方法,並將 Person 物件列表傳入。規則引擎會對每個人應用規則,並返回過濾後的列表。

最後,我們遍歷過濾後的列表,列印出符合指定規則的人名。

import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Person> people = List.of(
                new Person(<font>"Alice", 25),
                new Person(
"Bob", 31),
                new Person(
"Charlie", 35)
        );

        RuleEngine<Person> ruleEngine = new RuleEngine<>();
        ruleEngine.addRule(Rule.AGE_GREATER_THAN_30);
        ruleEngine.addRule(Rule.NAME_STARTS_WITH_B);

        List<Person> filteredPeople = ruleEngine.filter(people);

//this part only print result <i>
        for (Person person : filteredPeople) {
            System.out.println(person.getName());
        }
    }
}

結論
在本文中,我們瞭解瞭如何用 Java 構建一個簡單的規則引擎。規則引擎允許我們使用謂詞定義規則,並將其應用於物件集合。利用函數語言程式設計原則,我們可以建立一個靈活、可擴充套件的規則引擎,並將其用於各種場景。

透過理解這裡介紹的概念和程式碼,您可以在此基礎上擴充套件,建立更復雜的規則引擎,以滿足您的特定需求。
https://github.com/KiaShamaei/ruleEngine

相關文章