让我说我有:
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条件中没有静态值,有什么办法可以做,因为例如返回的内容:instance.getOCount()
可能会有所不同,具体取决于配置。
你能否告诉我如何实现这个目标?
答案 0 :(得分:11)
如果您有许多不同的if else
语句,则可以使用Strategy Pattern。这有助于您创建符合最佳实践的可管理代码。
答案 1 :(得分:5)
我认为没有必要用设计模式替换这么简单的逻辑,这是不合理的。 switch
将是一个改进(假设count
是一个整数),但为什么要创建一堆类?只有每个人都有其他不同的行为,才有理由。
答案 2 :(得分:3)
如果您使用NavigableMap
,例如TreeMap
,关键是您的阈值和值为Callable
s,那么您将能够检索到相应的{{1}所有在一个班轮中调用它。相关方法是Callable
。
NavigableMap#ceilingEntry
答案 3 :(得分:1)
我认为使用模式不是解决方案......一切都比原始代码更难阅读。但如果你确定,这是一个选择: 假设您的实例属于类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;
}
}
注意休息,我假设你的代码中只有一个动作可以执行 如果您不需要返回值,则可以使用抽象类而不是接口来进行if(select)action(); AbstractDynamicAction类的一部分代码将更好
Java7并没有真正帮助做那种事情。关闭会让眼睛看起来更容易......但是恕我直言,你的原始多重IF是可行的方式。