Java 用于根据多个条件筛选多个输入对象的规则引擎
我想设计一个规则引擎来过滤传入对象,如下所示: 开始时,我有三个不同的类:A、B、C。类的列表是动态的,也就是说:如果以后添加D和e,我想扩展它来处理D、e等类Java 用于根据多个条件筛选多个输入对象的规则引擎,java,oop,object,design-patterns,Java,Oop,Object,Design Patterns,我想设计一个规则引擎来过滤传入对象,如下所示: 开始时,我有三个不同的类:A、B、C。类的列表是动态的,也就是说:如果以后添加D和e,我想扩展它来处理D、e等类 public class A { int a1; String a2; boolean a3; Date a4; List<String> a5; ... } public class B { String b1; boolean b2; Date b3; lon
public class A {
int a1;
String a2;
boolean a3;
Date a4;
List<String> a5;
...
}
public class B {
String b1;
boolean b2;
Date b3;
long b4;
...
}
public class C {
String c1;
boolean c2;
Date c3;
long c4;
...
}
公共A类{
int a1;
a2串;
布尔a3;
日期a4;
清单a5;
...
}
公共B级{
b1串;
布尔b2;
日期b3;
长b4;
...
}
公共C类{
字符串c1;
布尔c2;
日期c3;
长c4;
...
}
将有A类、B类或C类的不同对象将被我的规则引擎过滤
用户可以根据类的每个成员变量可能具有的一组预定义操作定义不同的规则
以下是一些操作的示例:
public static <T> Predicate<T> rule(Predicate<T>... operations) {
return Arrays.stream(operations).reduce(Predicate::and).orElse(t -> true);
}
- a1可以有如下操作:>=,听起来规则实际上是由和ing其他谓词构成的。使用Java 8,您可以让用户为属性定义谓词:
此方法基于将从Predicate<A> operationA1 = a -> a.getA1() >= 10; // a1 is int Predicate<A> operationA2 = a -> a.getA2().startsWith("a"); // a2 is String Predicate<A> operationA3 = a -> a.getA3(); // == true; a3 is boolean Predicate<A> ruleA = operationA1.and(operationA2).and(operationA3);
、a
或B
(或将来的类)中提取属性的a,并在该属性上的C
谓词上创建谓词(表示您的一个操作) 对于我上面展示的相同示例,您可以这样使用它:
现在您已经定义了一些操作,您需要一种通用的方法来从操作中创建一个排除规则:Predicate<A> operation1A = operation(A::getA1, p -> p >= 10); Predicate<A> operation2A = operation(A::getA2, p -> p.startsWith("a")); Predicate<A> operation3A = operation(A::getA3, p -> p); // p == true ?
public static <T> Predicate<T> rule(Predicate<T>... operations) { return Arrays.stream(operations).reduce(Predicate::and).orElse(t -> true); }
听起来规则实际上是一个由其他谓词组成的谓词。使用Java 8,您可以让用户为属性定义谓词:
此方法基于将从Predicate<A> operationA1 = a -> a.getA1() >= 10; // a1 is int Predicate<A> operationA2 = a -> a.getA2().startsWith("a"); // a2 is String Predicate<A> operationA3 = a -> a.getA3(); // == true; a3 is boolean Predicate<A> ruleA = operationA1.and(operationA2).and(operationA3);
、a
或B
(或将来的类)中提取属性的a,并在该属性上的C
谓词上创建谓词(表示您的一个操作) 对于我上面展示的相同示例,您可以这样使用它:
现在您已经定义了一些操作,您需要一种通用的方法来从操作中创建一个排除规则:Predicate<A> operation1A = operation(A::getA1, p -> p >= 10); Predicate<A> operation2A = operation(A::getA2, p -> p.startsWith("a")); Predicate<A> operation3A = operation(A::getA3, p -> p); // p == true ?
public static <T> Predicate<T> rule(Predicate<T>... operations) { return Arrays.stream(operations).reduce(Predicate::and).orElse(t -> true); }
也许您需要查看Drools:。规则在代码中,或者您需要将它们存储在某个地方吗?i、 e.文本文件、数据库、,etc@tsolakp例如我想自己开发这个小发动机。谢谢你的建议。@Federicoperaltachaffner现在,让规则出现在代码中,但我还想在将来保存和加载规则,所以这是我以后需要注意的事情。@GhostCat嗨,我想你越界了。没有必要否决我的问题。我只是想得到一些想法,我可以开始这方面的工作。这只是征求意见。如果我已经编写了代码,我不会将其作为A、B或C类发布。我在哪里提到我需要代码示例?希望你能理解。也许你需要看看Drools:。规则在代码中,或者你需要将它们存储在某个地方吗?i、 e.文本文件、数据库、,etc@tsolakp例如我想自己开发这个小发动机。谢谢你的建议。@Federicoperaltachaffner现在,让规则出现在代码中,但我还想在将来保存和加载规则,所以这是我以后需要注意的事情。@GhostCat嗨,我想你越界了。没有必要否决我的问题。我只是想得到一些想法,我可以开始这方面的工作。这只是征求意见。如果我已经编写了代码,我不会将其作为A、B或C类发布。我在哪里提到我需要代码示例?希望您能理解。非常感谢您的及时回复。这对我来说是个好的开始。但是,如何将规则对象与建议的设计相关联?我想命名规则,然后列出与每个规则关联的条件列表,这样我就可以将规则保存到数据库并在以后加载以供重用。@Steven嗨!好的,您可以拥有实现
的谓词
和标准
类,也可以在这些类中拥有规则
类型的属性。当然,这些类也可以有一个谓词
属性。而name
类可以有一个属性,即规则
,等等。非常感谢您的回答。非常感谢您的及时回复。这对我来说是个好的开始。但是,如何将规则对象与建议的设计相关联?我想命名规则,然后列出与每个规则关联的条件列表,这样我就可以将规则保存到数据库并在以后加载以供重用。@Steven嗨!好的,您可以拥有实现列表标准
的谓词
和标准
类,也可以在这些类中拥有规则
类型的属性。当然,这些类也可以有一个谓词
属性。而name
类可以有一个属性,即规则
,等等。非常感谢您的回答。列表标准