具有优先级值的布尔列表

时间:2015-06-25 13:22:50

标签: java logic

我有很多布尔变量,最后只有一个应该是真的,顶部变量具有优先级。我不确定是否有特定的词来形容这一点,但我想知道是否有一种更清晰的方式用Java表达这一点?

以下是例子:

boolean a = /*...*/;
boolean b = !a && /*...*/;
boolean c = !a && !b && /*...*/;
boolean d = !a && !b && !c && /*...*/;
boolean e = !a && !b && !c && !d;

因此,只有当a到d为假时,e才为真,只有当a - c为假(且满足d条件)时d才为真,等等。

在Java中有更好的方法吗?有没有一个词可以表达这种逻辑?

1 个答案:

答案 0 :(得分:1)

您可以使用责任链设计模式。使用此模式,您可以组装一系列处理对象并将请求传递给它。处理从链的头部开始。当前链对象决定是否处理该命令。如果它不处理命令,它会将它传递给链上的下一个对象。

假设您有4个标准,CA,CB,CC和CD。您将拥有5个处理对象,其中4个对应于这4个标准,而另一个将接受任何内容,即不检查任何条件。

以下是一个改编自https://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

的示例
abstract class Processor {
    protected Processor successor;

    public void setSuccessor(Processor successor) {
        this.successor = successor;
    }

    abstract protected boolean checkCondition(OrderRequest request);

    abstract protected void execute(OrderRequest request);

    public void processRequest(OrderRequest request){
        if(checkCondition(request)) {
            execute(request);
        } else if(successor != null) {
            successor.processRequest(request);
        }
    }
}

public class CAProcessor extends Processor {
    protected boolean checkCondition(OrderRequest request) {
        return request.TotalWithVAT > 100 && request.getNPurchasedItems() > 20;
    }

    protected void execute(OrderRequest request) {
        //Here you can call some method, set some instance variable, etc...
        request.setTable(1);
    }
}

public class DefaultProcessor extends Processor {
    protected boolean checkCondition(OrderRequest request) {
        return true;
    }

    protected void execute(OrderRequest request) {
        request.setTable(5);
    }
}

要组装链,您可以执行类似

的操作
Processor ca = new CAProcessor();
Processor cb = new CBProcessor();
...
Processor defaultProcessor = new DefaultProcessor();
ca.setSuccessor(cb);
...
cd.setSuccessor(defaultProcessor);

执行

ca.execute(request);