我试图解决的问题是否有Java设计模式?

时间:2011-09-15 18:50:40

标签: java interface model design-patterns

我有一个包含Product对象数组的数据模型。在从此模型报告之前,我需要运行一组规则来检查模型中每个Product对象的完整性。我可以想到这样做的一种方法是使用规则界面,例如

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...
}

这减少了类的数量,但这意味着我最终得到了一个包含数百种方法的类。这两种方法对我来说都是错误的,我想知道是否有一个涵盖这种情况的设计模式,我可以使用它?

6 个答案:

答案 0 :(得分:3)

规范设计模式可以解决您的问题。

http://en.wikipedia.org/wiki/Specification_pattern

答案 1 :(得分:2)

模式?框架...

E.g。

答案 2 :(得分:2)

查找Java Validation API:

http://www.infoq.com/news/2010/03/javaee6-validation

它带有大量已经构建的验证器,您只需使用某些注释(例如@ZipCode和@NotNull)添加注释bean属性即可使用它,您可以轻松声明自定义验证器以及您希望它们验证的内容,你已经拥有了所有的脚手架。

答案 3 :(得分:1)

我认为你会发现你经常可以参数化规则,这样你就不需要每个规则附近任何一个类。如果您愿意考虑使用反射,则尤其如此。

JSR303,又名Java Validation API,适用于简单的字段验证,但当您需要执行更复杂的操作时,它会迅速耗尽。

如果我理解用例,那么Drools是不相关的 - 太重了。

仔细考虑如何处理验证错误。您希望能够报告多个错误 - 不要在第一个错误中拯救,您的用户会讨厌您。所以你可能希望有一些错误收集器对象,验证器将错误放入其中,然后由验证器框架返回。

答案 4 :(得分:0)

将规则作为单独的类似乎更好。将它们组织成一个有意义的包层次结构,以减轻精神负担。

将许多验证方法捆绑到一个类中会使该类繁重。最终,您希望将该类拆分为多个类,每个类具有一个入口点(并且可能传递验证回调,该回调会显示有关失败规则的通知)。但是,将单一规则隐藏在外部世界会很好,这会使测试变得困难。

答案 5 :(得分:0)

基本上,如果您有一组对象(在您的产品集合中)需要对它们执行一组操作(在您的情况下要检查每个产品的完整性),您必须使用访问者模式。模式的标准实现为每种产品类型重新启动一个操作(我假设您对每种产品类型都有单独的类)。但是如前所述,您可能会以某种方式减少在Product层次结构中执行子类化的方法的数量,并为该层次结构树的某些分支指定一些参数。