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

Java 我的用例使用哪种设计模式?,java,design-patterns,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={

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


如果重复使用的话,这条链子看起来很适合这个。另一个选项是使用存储在映射中的处理程序,其中键是适当的参数值。对于作为参数传递的有限的可能值集,这非常有效。您将得到如下结果:

handlers.get( a ).handle(XYZ)

所以,如果你少一点的话。但同样,这并不适合所有目的。

寻找类似命令模式的东西。根据需要处理的参数数据。内部实现不应暴露在外部。因此,从公开接口的角度来看,它必须考虑参数和数据,命令模式需要根据参数确定要执行的方法。

如果没有真实的大小写,很难说,但最有可能的是,您将能够通过良好的类层次结构来减小if/else树的大小


多态性也将使它更面向对象。

您列出的if-then-else语句让我想起了一个。规则库本质上是一个数据库,包含
条件->操作
形式的规则。Java 8中条件的实现可能如下所示:

 @FunctionalInterface
 interface Condition {
    boolean matches(A a, B b, C c, D d);
 }
evaluate(A1, B1, null, null);
// executes doSomethingA1() and doSomethingB1()
对于
操作
,您只需使用
可运行
。根据您的代码,规则库定义可以定义如下:

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();
您可以这样称呼它:

 @FunctionalInterface
 interface Condition {
    boolean matches(A a, B b, C c, D d);
 }
evaluate(A1, B1, null, null);
// executes doSomethingA1() and doSomethingB1()

如果你要投反对票,请留下理由。还有@Joshi,我理解这个问题,但是您给出的用例非常抽象。你能提供更多的细节,或者甚至发布你到目前为止的代码吗?我认为否决票是因为这是基于意见的。关于主题:我想我们需要更多的信息来回答这个问题。每个参数的数据处理是连续的,还是一次完成的?这些参数相互依赖吗?是否会有超过4个参数?匿名类可以解决很多问题,不需要模式。我认为任何涉及设计模式(或一般设计)的讨论都是基于观点的。不过,这是一次重要的讨论:-)