【发布时间】:2011-09-15 18:50:39
【问题描述】:
我有一个包含 Product 对象数组的数据模型。在从此模型报告之前,我需要运行一组规则来检查模型中每个 Product 对象的完整性。我能想到的一种方法是使用 Rule 接口,例如
public interface CheckRule {
boolean runRule(Product p);
}
对于每个规则,我可以有一个单独的 Rule 类来实现 CheckRule 接口。然后我可以有一个双循环来运行所有规则,例如:
for (Product p : Products) {
for (Rule r : Rules) {
if (! r.runRule(p) {
// report on the broken rule
}
}
}
如果我有数百个规则,但我最终会得到数百个规则类,这似乎是一种混乱的方式。另一种方法是有一个 RuleManager 类,它为每个规则都有一个单独的方法,例如
public class RuleManager {
boolean runRule1(Product p) { // rule 1 logic}
boolean runRule2(Product p) { // rule 2 logic}
boolean runRule3(Product p) { // rule 3 logic}
etc...
}
这减少了类的数量,但意味着我最终得到了一个包含数百个方法的类。这两种方法我都觉得不对,我想知道是否有一种设计模式可以涵盖这种情况,我可以使用它来代替吗?
【问题讨论】:
-
我不明白如何避免拥有一个包含很多方法的非常大的 RuleManager 类或许多小类。如果您必须用 Java 编写规则,我看不到另一种方法。也许如果你可以用一些简单的语言来表达规则,你可以用规则编写一个文本文件,让 Java 在运行时解析和应用规则。这是一个选项吗?
-
有些规则需要相当复杂的逻辑,在文本文件中很难表达。我不介意参加很多课程,只要我不会错过获得相同结果的更好方法。
-
在我看来,这就像组合器是所描述的解决方案的情况。您的函数将从 Product 变为布尔值。你可以在这里得到一个想法,它真的很有用:github.com/raganwald/homoiconic/blob/master/2008-11-07/…
-
谢谢安德烈亚斯,有时间我会看看你的文章。
标签: java interface model design-patterns