【问题标题】:boolean list with priority values具有优先级值的布尔列表
【发布时间】:2015-06-25 13:22:50
【问题描述】:

我有许多布尔变量,最后只有一个应该为真,顶部变量具有优先权。我不确定是否有一个特定的词来描述这一点,但我想知道在 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 中有没有更好的方法来做到这一点?有什么词可以表达这种逻辑吗?

【问题讨论】:

  • 这似乎不是一件特别有用的事情。你想解决什么问题?也许有更好的方法。
  • 采购订单经过的流程模型。它通过“A”直到满足某个标准,然后进入“B”直到另一个标准,然后是 C,然后是 D,​​等等。所以这将确定订单显示在哪个表上。

标签: java logic


【解决方案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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 2023-04-02
    • 2022-08-17
    • 2011-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多