实现NotSpecification的好方法:isSpecialCaseOf?

时间:2010-04-07 18:51:46

标签: design-patterns specifications specification-pattern

我正在实施规范模式。 NotSpecification起初看起来很简单:

NotSpecification.IsSpecialCaseOf(otherSpecification)
    return !this.specification.isSpecialCaseOf(otherSpecification)

但它并不适用于所有规格:

Not(LesserThan(4)).IsSpecialCaseOf(Equals(5))

这应该返回false而不是true。到目前为止,我认为完成isSpecialCaseOf NotSpecification的唯一方法是实现remainingUnsatisfiedBy(文章中关于规范模式的部分包含)。但也许我错过了一些更简单或逻辑的见解,这使得这不必要。

问题:是否有另一种方法可以通过不使用remainderUnsatisfiedBy实现这一点?

1 个答案:

答案 0 :(得分:3)

我试图在Java中实现它,它没有问题,并且restUnsatisfiedBy()。可能你的实现有问题,这是我的:

public boolean isSpecialCaseOf(Specification spec) {
    if (spec instanceof GreaterThan) {
        return ((GreaterThan) spec).boundary > this.boundary;
    }
    return false;
}

catch是在Not()方法中,它应该正确地构造其参数的相反类型。

static final Specification Not(Specification spec) {
    return spec.not();
}

然后我需要的是为每个规范正确实现not(),例如:对于LesserThan:

    @Override
public Specification not() {
    return new GreaterThan(boundary);
}

如果您有任何问题,请提供您对GreatherThan.isSpecialCaseOf和Not的实施,我会尽力帮助。