对于显示产品信息的页面,我们必须从显示相同内容但具有不同格式(gif,png,jpg等),不同质量(jpeg comrpession)的一组图像中选择最佳产品图像),不同尺寸(缩略图,小,中,大)等。
选择取决于用户的浏览器,当前页面大小,图像用途等。
我们当前的解决方案是根据当前的需求构建一个SQL查询:
SELECT img.id
FROM img
WHERE img.format IN ('GIF','JPG')
AND img.width <= 1000
ORDER BY img.quality DESC
这是一个简单的例子,原件要复杂得多。创建此语句的java代码使用了大量的ifs和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和一些开源规则引擎,但它们似乎都在处理Buissness规则。
我有强烈的感觉,我们正在重新发明轮子,我们根本无法找到任何解决方案,因为我们不知道这些东西的正确名称; - )
非常感谢任何帮助!
答案 0 :(得分: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; }
}