我有一个用例,其中输入是参数集(比如A,B,C,D)和数据(比如XYZ)。基于参数(A,B,C,D),我必须处理数据(XYZ)并回复。处理逻辑可以是基于参数的唯一或共同的(例如,当A执行时,执行#1操作,执行A和C时执行#2操作,执行B,C和D时执行#2操作等)。我可能还需要维护处理顺序。
当前的实现基于if-else循环。我正在寻找责任链,管道设计模式。但是上述任务还有其他合适的设计模式吗?
使用if-else块的示例:
I / P:A = {A1,A2,A3},B = {B1,B2,B3},C = {C1,C2,C3},D = {D1,D2,D3}和XYZ =“ foo“的
if (A == A1)
{
//dosomething-A1
if (B == B1)
{
//dosomething-B1
if (C == C2)
{
//dosomething-C2
}
}
else if (B == B2)
{
//dosomething-B2
}
if (C == C2)
{
//dosomething-C2
if (D == D1)
{
//dosomething-D1
}
else if (D == D3)
{
//dosomething-D3
}
}
}
else if (A == A2)
{
//dosomething-A2
...
}
else if (A == A3)
{
//dosomething-A3
...
}
答案 0 :(得分:4)
handlers.get( a ).handle(XYZ)
所以,完全不用你自己。但同样,这并不适合所有目的。
答案 1 :(得分:3)
寻找命令模式之类的东西。基于需要处理的参数数据。内部实施不应暴露在外面。因此,从公开接口的角度来看,它必须采用参数和数据,命令模式需要根据参数确定要执行的方法。
答案 2 :(得分:0)
如果没有真正的单词案例,很难说,但很可能你将能够减少具有良好的类层次结构的if / else树的大小。
多态性也会使它更加面向对象。
答案 3 :(得分:0)
你的if-then-else语句列表让我想起rule-based system。规则库本质上是一个包含Condition -> Action
形式规则的数据库。 Java 8中的条件实现可能如下所示:
@FunctionalInterface
interface Condition {
boolean matches(A a, B b, C c, D d);
}
对于Action
,您只需使用Runnable
。根据您的代码,规则库定义可以定义如下:
static final Map<Condition, Runnable> BASE =
ImmutableMap.<Condition, Runnable>builder()
.put((a, b, c, d) -> a == A1, () -> doSomethingA1())
.put((a, b, c, d) -> a == A1 && b == B1, () -> doSomethingB1())
.put((a, b, c, d) -> a == A1 && b == B1 && c == C2, () -> doSomethingC2())
.put((a, b, c, d) -> a == A1 && b == B2, () -> doSomethingB2())
.put((a, b, c, d) -> c == C2, () -> doSomethingC2())
.put((a, b, c, d) -> c == C2 && d == D1, () -> doSomethingD1())
.put((a, b, c, d) -> c == C2 && d == D3, () -> doSomethingD3())
.put((a, b, c, d) -> a == A2, () -> doSomethingA2())
.put((a, b, c, d) -> a == A3, () -> doSomethingA3())
.build();
要使用此规则库,您只需定义以下方法:
static void evaluate(A a, B b, C c, D d) {
BASE.entrySet().stream()
.filter((entry) -> entry.getKey().matches(a, b, c, d))
.forEach((e) -> e.getValue().run());
}
允许你这样称呼它:
evaluate(A1, B1, null, null);
// executes doSomethingA1() and doSomethingB1()