0

对于显示产品信息的页面,我们必须从一组显示相同内容但具有不同格式(gif、png、jpg 等)、不同质量(jpeg 压缩)、不同的图像中选择最佳产品图像尺寸(缩略图,小,中,大)等。

选择取决于用户的浏览器、页面的当前大小、图像的用途等。

我们当前的解决方案是根据当前的需求构建一个 sql 查询,可能看起来像这样:

SELECT img.id 
FROM img 
WHERE img.format IN ('GIF','JPG') 
AND img.width <= 1000
ORDER BY img.quality DESC

这是一个简单的例子,原来的例子要复杂得多。创建此语句的 java 代码使用了很多 if 和 case,并且开始变得非常难看。

在 Java 中实现这种启发式的最佳方法是什么?有没有图书馆可以提供帮助?也许沿着定义规则对象的路线:

Engine engine = new Engine();
engine.addRule(new IncludeRule("format", {"GIF", "JPG"}));//only gif and jpg
engine.addRule(new MaxRule("width", 1000));//max width
engine.addRule(new WeightedRule("quality", DESC));//go for high quality
Image result = engine.getResult();

我搜索了规则引擎,甚至有一个 JSR 和一些开源规则引擎,但它们似乎都是在处理商业规则。

我有强烈的感觉,我们正在重新发明轮子,而且我们根本找不到任何解决方案,因为我们不知道这些东西的正确名称;-)

任何帮助将不胜感激!

4

1 回答 1

1

如果您只是构建 SQL 查询,您可以自己构建引擎:

public interface Rule{
    String getSQLWhereClause();
    String getSQLOrderClause();
}

public class Engine
{
    String buildSQLFromRules(Collection<Rule> rules) {
        String s = "SELECT IMG.ID FROM IMG";
        String w = "";
        String o = "";

        for(Rule r : rules)
        {
             if (r.getSQLWhereClause() != null) {
                 if (!w.isEmpty()) { w = w + " AND " }

                  w += r.getSQLWhereClause()
             }
             ... same for order
         }

         return s + (w.isEmpty()? "" : " WHERE " + w) + (o.isEmpty()?"": " ORDER BY " + o);
      }
 }

然后您可以将接口定义为:

 public class MaxRule implements Rule
 {
       String fld;
       String max;

       public MaxRule() { ... }

       String getSQLWhereClause() { return "img." + fld + " <= " + max; }
       String getSQLOrderClause() { return null; }
 }
于 2010-10-15T17:16:00.410 回答