多路分发の实现

什么是多路分发

比如要执行一个通用的数学计算,计算表达式可能是a.plus(b),但是不知道a和b的具体类型,如果按照普通的做法,需要对a和b做两次类型判断,这种写法不够优雅。

好的解决办法就是使用多路分发,一共5种方式:

  • 方法重载分发
  • 枚举分发
  • 常量特定方法分发
  • EnumMap分发
  • 二位数组分发

下面看一个“石头剪子布”的示例。

方法重载分发

这种就是根据Java的多态特性+方法重载,a使用多态来确定类型,b根据多个重载方法确定类型

花了点时间,画了个类图

package onJava.enums.multi;

/**
 * 分发类型接口
 */
public interface Item {
   
    Outcome compete(Item it);
    Outcome eval(Paper p);
    Outcome eval(Scissors s);
    Outcome eval(Rock r);
}

package onJava.enums.multi;

/**
 * 结果枚举
 */
public enum Outcome {
   

    WIN, LOSE, DRAW
}

package onJava.enums.multi;
import static onJava.enums.multi.Outcome.*;

/**
 * 布
 */
public class Paper implements Item {
   
    @Override
    public Outcome compete(Item it) {
   
        //传入参数与本类比较,返回传入参数的比较结果
        return it.eval(this);
    }

    @Override
    public Outcome eval(Paper p) {
   
        return DRAW;
    }

    @Override
    public Outcome eval(Scissors s) {
   
        return WIN;
    }

    @Override
    public Outcome eval(Rock r) {
   
        return LOSE;
    }

    @Override
    public String toString() {
   
        return "Paper";
    }
}

-----------------------------分割线--------------------------------


package onJava.enums.multi;
import onJava.enums.multi.Outcome.*;

/**
 * 石头
 */
import static onJava.enums.multi.Outcome.*;

public class Rock implements Item {
   
    @Override
    public Outcome compete(Item it) {
   
        return it.eval(this);
    }

    @Override
    public Outcome eval(Paper p) {
   
        return WIN;
    }

    @Override
    public Outcome eval(Scissors s) {
   
        return LOSE;
    }

    @Override
    public Outcome eval(Rock r) {
   
        return DRAW;
    }

    @Override
    public String toString() {
   
        return "Rock";
    }
}

-----------------------------分割线--------------------------------


package onJava.enums.multi;
import onJava.enums.multi.Outcome.*;

import static onJava.
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值