摆脱if语句以改进代码设计

时间:2016-06-13 20:14:20

标签: java if-statement strategy-pattern

如何改进以下代码的设计:

class Foo {
   public Configuration configure() {
      return new Configuration().withPropertyA().withPropertyB();
   }
}

class Configuration{


   private boolean propertyA = false;
   private boolean propertyB = false;

   public Configuration withPropertyA() {
       this.propertyA = true;
       return this;
   }

    public Configuration withPropertyB() {
       this.propertyB = true;
       return this;
   }

   public boolean hasPropertyA() {
      return this.propertyA;
   }

   public boolean hasPropertyB() {
      return this.propertyB;
   }

   ...
}

class Client{

public void someMethod(Configuration config) {
   if (config.hasPropertyA() {
      doStuffA();
   }
   if (config.hasPropertyB() {
      doStuffB();
   }
   //...
}

}

即,Configuration类为调用者(Client)保留一些标志,告诉调用者需要配置哪些“东西”。如果已设置,则客户端知道如何为每个标志执行操作。我想摆脱Client中的if语句以及在Configuration实例中简单设置布尔标志的概念。你能建议一个更“通用”和面向对象的方法吗?

亲切的问候

3 个答案:

答案 0 :(得分:1)

您可以使用策略模式。 每个If成为一个策略,它实现了doStuff,具有自己的逻辑。设置属性(A,B ...)后,将策略添加到列表中。你只需要循环策略并执行它们,而不需要任何ifs:

public class Foo  {
    public Configuration configure() {
        return new Configuration().withPropertyA().withPropertyB();
    }
}

class Configuration {
    Set<StuffStrategy> strategies = new HashSet<StuffStrategy>();

    public Configuration withPropertyA() {
        strategies.add(new PropertyAStrategy());
        return this;
    }

    public Configuration withPropertyB() {
        strategies.add(new PropertyBStrategy());
        return this;
    }

    public void executeStrategies() {
        for (StuffStrategy strategy : strategies) {
            strategy.doStuff();
        }
    }
}

interface StuffStrategy {
    public void doStuff();
}
class PropertyAStrategy implements StuffStrategy {
    @Override
    public void doStuff() {
    }
}

class PropertyBStrategy implements StuffStrategy {
    @Override
    public void doStuff() {
    }
}

class Client {
    public void someMethod(Configuration config) {
        config.executeStrategies();
    }
}

答案 1 :(得分:1)

我不相信你能找到比现在更多的OO方法,特别是如果你可以有更多的参数,实际上这是一个众所周知的设计模式Builder,你能做到最好通过使对象o.on("company_filter_fetch_page_complete", function(e) { return t.ajax({ url: "/companies/startups", data: e, dataType: "json", success: function(t) { return t.html ? (E().find(".more").empty().replaceWith(t.html), c()) : void 0 } }) }), 从外部不可变,只有您的构建器类应该能够创建Configuration的实例,才能正确地完成实现此模式。您的构建器应该是一个可变的静态内部类,其中Configuration方法返回一个不可变的build()实例。

答案 2 :(得分:-1)

看起来你正在写一个陷阱

尝试在这种情况下使用设计中更灵活的东西......就像一个枚举器...... 看看这个:

实施例

public class Foo {
    public Configuration configure() {
    return new Configuration(Config.A);
    }
}

class Configuration {

enum Config{
A,B, NONE}

    private Config propertyConfig = Config.NONE;

    public Configuration(Config a) {
    propertyConfig=a;
    }


    public Config getConfig() {
    return this.propertyConfig;
    }

    ...
}

class Client {

    public void someMethod(Configuration config) {
       switch (config.getConfig()) {
    case A:
        System.out.println("a config");
        break;
    case B:
        System.out.println("b config");
        break;

    default:
        break;
    }
    // ...
}

}