0

可以说我有:

if (count <= instance.getFCount()) {
    //do something and return String
} else if (count <= instance.getFSCount()) {
    //do something and return String
} else if (count <= instance.getTCount()) {
    //do something and return String
} else if (count <= instance.getOCount()) {
    //do something and return String
}

我在想如何将这段代码替换为更面向对象的代码。问题是,如果我有这样的声明:

if (count <= 0) {
    //do something and return String
} else if (count <= 1) {
    //do something and return String
} else if (count <= 2) {
    //do something and return String
} else if (count <= 3) {
    //do something and return String
}

我可以用一些工厂模式或基于枚举的方法来替换它,因为我的值 0、1、2、3 总是静态的。例如,我将创建一个映射以将类与数字保持一致,然后如果我的计数为 0,我将知道我需要从映射为零的类中创建一个实例,依此类推。

但是现在我在想,如果我在 if 条件中没有静态值,是否有任何方法可以完成,因为例如返回到 this: 的内容instance.getOCount()可能因配置而异。

你能给我一些想法如何实现这一目标吗?

4

4 回答 4

11

当您有很多不同的if else语句时,您可以使用策略模式。这有助于您创建符合最佳实践的可管理代码。

于 2013-02-26T13:49:51.273 回答
5

我相信没有必要用设计模式来代替这么简单的逻辑,这是不合理的。Aswitch将是一个改进(假设count是一个整数),但为什么要创建一堆类呢?只有当每个人都有额外的、不同的行为时,这才是合理的。

于 2013-02-26T13:51:12.737 回答
3

如果您使用NavigableMap诸如 a之类的TreeMap,键是您的阈值,值是Callables,您将能够检索适当的Callable并调用它,所有这些都在单行中。相关方法是NavigableMap#ceilingEntry

final NavigableMap<Integer, Callable<String>> strats = new TreeMap<>();

...

return strats.ceilingEntry(val).getValue().call(args);
于 2013-02-26T13:52:02.293 回答
1

我不认为使用模式是这里的解决方案......一切都比你的原始代码更难阅读。但是,如果您确定,这是一种选择:假设您的实例属于用户类。创建接口

public interface IDynamicAction<T> {
boolean select(T t);
String action(T t);
}

做一个列表

List<IDynamicAction<User>> actions = new ArrayList<IDynamicAction<User>>();
actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getFSCount();
}

@Override
public String action(User t) {
    System.out.println("count <= instance.getFSCount()");
    return "count <= instance.getFSCount()";
}
});


actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getTCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getTCount()");
    return " count <= instance.getTCount()";
}
});

actions.add(new IDynamicAction<User>() {
@Override
public boolean select(User instance) {
    return count <= instance.getOCount();
}
@Override
public String action(User t) {
    System.out.println("count <= instance.getOCount()");
    return " count <= instance.getOCount()";
}
});

并执行你的代码

for(IDynamicAction<User> action : actions){
if(action.select(instance)){
    String s = action.action(instance);
    System.out.println(s);
    break;
}

}

请注意中断,我假设基于您的代码只有一个动作可以执行如果您不需要返回值,您可以使用抽象类而不是接口并制作 if(select) action(); AbstractDynamicAction 类的一部分,代码会更好

Java7 并没有真正帮助做那种事情。闭包会让这件事看起来更容易......但恕我直言,你原来的多重 IF 是要走的路。

于 2013-02-26T15:30:15.300 回答