假设我有:
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,我将知道我需要从映射为0的类创建一个实例,以此类推。
但现在我在想,如果我没有在if条件下的静态值,如果有任何方法可以做,因为例如返回到这个:instance.getOCount()
可能根据配置而不同。
你能给我一些想法如何实现这一点吗?
当您有许多不同的if else
语句时,您可以使用策略模式。这可以帮助您创建符合最佳实践的可管理代码。
我认为没有必要用设计模式代替这样一个简单的逻辑,这是不合理的。switch
将是一个改进(假设count
是一个整数),但为什么要创建一堆类?只有当每个人都有额外的、不同的行为时,它才合理。
如果使用NavigableMap
(如TreeMap
),键是阈值,值是Callable
,则可以检索适当的Callable
并调用它,这一切都在一行代码中完成。相关方法为NavigableMap#ceilingEntry
。
final NavigableMap<Integer, Callable<String>> strats = new TreeMap<>();
...
return strats.ceilingEntry(val).getValue().call(args);
我不认为使用模式是这里的解决方案…所有内容都将比原始代码更难阅读。但如果你确定,这是一个选择:让我们假设你的实例属于一个类User。创建接口
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;
}
}
注意break,我假设在你的代码中只有一个动作可以执行如果你不需要返回值,你可以使用抽象类而不是接口,并使If (select) action();作为AbstractDynamicAction类的一部分,代码将会更好
Java7并没有真正帮助做这类事情。闭包会让这些东西更容易看……但恕我直言,你原来的多重IF是可行的。