【问题标题】:Design approach for multiple if else statement?多个if else语句的设计方法?
【发布时间】:2017-05-05 06:57:40
【问题描述】:

我有将 sql 查询作为字符串返回的方法。此方法考虑参数 'level' ,基于此 参数有多个if else语句,如

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

   so on 

未来的关卡数量将会增加,我不想写讨厌的 if else 语句,所以我正在为这个场景寻找更清洁和可维护的设计方法。 我正在考虑策略设计模式,但不确定它是否最适合这种情况。

【问题讨论】:

标签: java design-patterns


【解决方案1】:

您有多种选择:

  1. if/else if 正如你所指出的那样。

  2. 一个switch statement。

  3. 一个Map,键是级别字符串,值是功能接口类型的引用(Runnable 或来自java.util.function 的适当接口,或您自己的),您可以使用@987654323 进行初始化@、lambdas、匿名类实例,甚至是需要的具体类实例。

这是最后一个选项的示例,使用最基本的功能接口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");
    }
}

【讨论】:

    【解决方案2】:

    您可以使用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 即可添加新关卡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      • 2015-02-06
      • 1970-01-01
      相关资源
      最近更新 更多