2017-05-05 108 views
-1

我有返回SQL查詢作爲字符串的方法。此方法考慮參數「等級」,在此基礎上 參數有多個if else語句像多if if語句的設計方法?

if(level.equals("A1")){ 
    // add some field in query 
    } 
    else if (level.equals("A2")) 
    { 
    // add some field and logic in query 
    } 
    .. 

    so on 

在水平未來數會增加,我我想知道我寫的麻煩,如果else語句,所以我我正在尋找更清潔和可維護的設計方法。 我在考慮策略設計模式,但不確定是否最適合這種情況。

+0

'A1,A2,...'作爲'characters'無效。 –

+0

https://sourcemaking.com/refactoring/replace-conditional-with-polymorphism – jaco0646

回答

2

您有幾種選擇:

  1. if/else if爲你指示。

  2. A switch statement

  3. 一個Map與鍵在水平字符串,是一個功能接口類型(Runnablejava.util.function,或者你自己一個合適的接口)的參考值,你可以用method referenceslambdas,匿名類實例的初始化,或即使是具體的類實例也是如此。

下面是最後一個選項的一個例子,使用最基本的功能接口,Runnable,有方法參考:

import java.util.Map; 
import java.util.HashMap; 

public class Example { 
    private Map<String, Runnable> handlers; 

    public Example() { 
     this.handlers = new HashMap<String, Runnable>(); 
     this.handlers.put("A1", this::a1action); 
     this.handlers.put("A2", this::a2action); 
    } 

    private void a1action() { 
     System.out.println("Action A1"); 
    } 

    private void a2action() { 
     System.out.println("Action A2"); 
    } 

    public void handleAction(String action) { 
     Runnable handler = this.handlers.get(action); 
     if (handler == null) { 
      System.out.println("No handler for '" + action + "'"); 
     } else { 
      handler.run(); 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     Example ex = new Example(); 
     ex.handleAction("A1"); 
     ex.handleAction("A2"); 
     ex.handleAction("A3"); 
    } 
} 
0

您可以使用enum列出的操作和使用valueOf摸出要使用哪個。

enum Levels { 
    A1 { 
     @Override 
     void doSomethingToTheQuery(Query q) { 
      // add some field in query 
     } 
    }, 
    A2{ 
     @Override 
     void doSomethingToTheQuery(Query q) { 
      // add some field and logic in query 
     } 
    }; 

    abstract void doSomethingToTheQuery(Query q); 
} 

public void test() { 
    // Lookup the level and do hack the query. 
    Levels.valueOf("A1").doSomethingToTheQuery(q); 
} 

然後,您可以添加新的級別只需添加到enum