用于在java中封装自定义过滤器的设计模式

时间:2014-11-11 21:02:23

标签: java design-patterns

我正在设计一个模块,它在队列中以JSON格式获取大量数据。现在用户可以提供过滤器,模块应该能够返回与过滤条件匹配的所有元素。

数据是键值格式,因为我事先不知道字段的名称,但它是数据本身的一部分。像这样的东西 -

metrics-list -
         metrics: [
            {
                key: name,
                actual-metrics-values: {
                   String : Float
                }  
            }
]

现在我计划过滤器对象应该具有以下结构 -

Class Filter {
   String Name;
   String filterCondition;
   Metrics[] apply();
}

最大的问题是如何存储filterCondition,以便我可以将其应用于数据集并获取与条件匹配的指标。一个例子是 - 我得到这样的数据 -

 metrics: [
            {
                key: blah1
                actual-metrics-values: {
                   a : 10.0,
                   b : 5.0
                }  
            },
             {
                key: blah2
                actual-metrics-values: {
                   a : 7.0,
                   b : 3.0
                }  
            }
]

并且过滤器类似于> 7.0&& b< = 7.0,它应该将blah1作为唯一的匹配度量返回。

2 个答案:

答案 0 :(得分:1)

我觉得您想要从用户输入的字符串中解析过滤器逻辑。这将非常快速地参与其中。如果您可以将过滤器保存在Java代码中,则可以使用lambda表达式或Guava Predicate类。

<强>更新

我认为让“自由形式”用户提供过滤器即使使用现有的表达式解析库也需要大量的工程工作。我鼓励您考虑在UI中为用户提供一定数量的过滤器,并将其映射到过滤Java代码。

Java ScriptEnginge确实是找到类似问题的正确途径。来自文档:

  

脚本语言的一些有用特性是......应用程序扩展/自定义:您可以“外部化”应用程序的某些部分 - 例如配置脚本,业务逻辑/规则和财务应用程序的数学表达式。

site有更多示例。

答案 1 :(得分:1)

实现此类过滤器的快速方法是在脚本语言中嵌入表达式,例如在JavaScript中,然后使用ScriptEngine对其进行评估。