我的用例使用哪种设计模式?

时间:2016-01-21 18:22:06

标签: java design-patterns

我有一个用例,其中输入是参数集(比如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
    ...
}

4 个答案:

答案 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()