什么是多路分发
比如要执行一个通用的数学计算,计算表达式可能是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.