如何优化IF/ESE的结构

目前总结了三种简化多层 if/else 的方法:

  1. 多态的方式。
  2. 图结构解决
  3. 判断树

多态方式。

多态的方式利用 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值