2016-01-21 43 views
5

我有一個用例,其中輸入是參數集(比如說A,B,C,D)和數據(比如XYZ)。根據參數(A,B,C,D),我必須處理數據(XYZ)並作出迴應。處理邏輯可以是基於參數的唯一或通用的(例如,只有在A時做#1,當A和C做#2,做B#,C和D等等#2時做#2)。我可能還需要維護處理的順序。哪種設計模式用於我的用例?

當前實現基於if-else循環。我正在尋找責任鏈,管道設計模式。但是上述任務有沒有其他合適的設計模式?

實施例使用的if-else塊:

I/P:A = {A1,A2,A3},B = {B1,B2,B3},C = {C1,C2,C3},d = {D1,D2,D3}和XYZ =「富」

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 
    ... 
} 
+3

如果你要倒下,請留下一個理由。而@Joshi,我理解這個問題,但你提供的用例非常抽象。你可以提供更多細節,或者發佈迄今爲止的代碼嗎? –

+0

我認爲downvote是因爲這是基於意見的。關於主題:我認爲我們需要更多的信息來回答這個問題。每個參數的數據處理都是連續的,還是一氣呵成?參數是否相互依賴?會有超過4個參數嗎?匿名類可以在這裏解決很多問題,不需要任何模式。 –

+1

我認爲任何涉及設計模式(或一般設計)的討論都是基於意見的。不過,這是一個重要的討論:-) –

回答

4

鏈似乎很適合,如果它被重用。另一種選擇是使用存儲在映射中的處理程序,其中鍵是適當的參數值。這適用於作爲參數傳遞的可能值的有限集合。你會得到這樣的:

handlers.get(a).handle(XYZ) 

所以,如果完全無你的一部分。但是,這又不符合所有目的。

3

尋找類似命令模式的東西。根據需要處理的參數數據。內部實施不應暴露在外。因此,從暴露的接口角度來看,它必須採取參數和數據以及命令模式來根據參數識別要執行的方法。

0

如果沒有真正的單詞情況,很難說,但很可能您將能夠通過良好的類層次結構減少if/else樹的大小。

多態性將使它更加面向對象。

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() 
相關問題