目前总结了三种简化多层 if/else 的方法:
- 多态的方式。
- 图结构解决
- 判断树
多态方式。
多态的方式利用 Java 对象多态的特性。如下所示样式的语句。
public void method(flag){
if(flag == var1){
//do_something
}else if(flag == varr){
// do_something
}else{
// the last choice
}
}
我们可以改造成如下的写法;
public void method(flag){
AInterface inter = map.get(flag);
inter.handler(data);
}
我们先建一个接口,在接口中定义处理数据的方法名称。
再实现对应每种 flag 的类。然后,将类放到 map 里面。
这样得代码是不是看起来简洁了许多。
还可以使用枚举来实现。
public Enur{
ONE(1){
public void handler(JavaBean jb){
// 1 对应的处理方法。
}
};
TWO(2){
public void handler(JavaBean jb){
// 2 对应的处理方法。
}
}
public int type ;
public void handler(JavaBean jb);
}
EnurMap 对 type 值进行检索就 ok 了。
如果是多个判断条件,就需要构建一颗判断树。举个例子,如果有 10 个参数,如果第一个参数逻辑判断结果是 true ,则对第二个参数进行逻辑判断,否则使用第三个参数进行逻辑判断。依次类推。这种一环扣着一环,层层递进的模式,像不像一颗树。
判断树
先来定义一个接口,这个接口规定了判断树走向的方法、对数据的处理方法。
abstract class ConditionTree<T>{
// 根据 JavaBean 成员变量中的值,进行判断
// 最后返回真或真假。
// return 判断结果 ;
public abstract ConditionTree ConditionExec(JavaBean jb);
public abstract ConditionTree left ;
public abstract ConditionTree right;
public abstract T dataHandler(JavaBean jb){
// 对 JavaBean 惊醒处理。这里也可以是一个数组。
// 然后,最后返回一个 T 。
}
}
然后我们就可以在类里面实现我们的判断逻辑了。例如:
public class Field1 implements ConditionTree<Result> {
public ConditionTree ConditionExec(JavaBean jb){
if(jb.getField1() > 1){
return new Field2(jb);
}
return this ;
}
public void setLeft(ConditionTree ct){
this.left = ct ;
}
public void setRight(ConditionTree ct){
this.right = ct ;
}
public Result dataHandler(JavaBean jb){
// 对 jb 做处理
}
}
如果我们用图来表示这样的结果,就得到如下图表。
node
/ \
node node
/ \ / \
node node node node
当走到一个叶子节点的时候,就需要调用 dataHandler 方法,返回 Result。