java 多路分发
1.概念
一个函数处理多种类型,其实和多态差不多.
但是要处理两种或者多种类型的数据时,就需要判断每种类型以及每种类型所对应的处理.(PS:我只是在走别人的老路,网上一搜这种概念,博客一大堆,我不知道自己写博客总结有没有意义,毕竟已经有那么多博客了,
但是我还是想记录下自己成长的过程,自己差了好多....如果只有一两篇博客还好,一大堆相同概念的博客真的是,差了好多.)
2.解决:
编程思想的处理很有意思,先给出一两个不那么完美的反例,然后循序渐进给出最好的解决方案,并说出每种方案的优点和缺点,这种方式更容易让人印象更深刻,我在这里就不列举那么多栗子了,就举出最优的一两个例子,重复别人的老路,记录下成长.
2.1EnumMap解决
public enum RoShamBo5 implements Competitor<RoShamBo5>{
PAPER, SCISSORS, ROCK;
static EnumMap<RoShamBo5, EnumMap<RoShamBo5, Outcome>> table =
new EnumMap<>(RoShamBo5.class);//创建EnumMap (value 对应的也是一个EnumMap)
static {
for (RoShamBo5 it : RoShamBo5.values()) {
table.put(it, new EnumMap<>(RoShamBo5.class));//先 在 key 中 放入剪刀石头布
}
//在初始化 value 的 EnumMap
initRow(PAPER, DRAW, LOSE, WIN);
initRow(SCISSORS, WIN, DRAW, LOSE);
initRow(ROCK, LOSE, WIN, DRAW);
}
static void initRow(RoShamBo5 it, Outcome vPaper, Outcome vSCISSORS, Outcome vROCK) {
//value 的 EnumMap 中的 key 放入剪刀石头布, value 放入 相对应的结果
EnumMap<RoShamBo5, Outcome> row = RoShamBo5.table.get(it);
row.put(RoShamBo5.PAPER, vPaper);
row.put(RoShamBo5.SCISSORS, vSCISSORS);
row.put(RoShamBo5.ROCK, vROCK);
}
@Override
public Outcome compete(RoShamBo5 competitor) {
return table.get(this).get(competitor);
}
public static void main(String[] args) {
RoShamBo.play(RoShamBo5.class, 20);
}
}
注释我已经说明了解决思路,就不再重复,这里说下思想: EnumMap和Map差不多,只不过key必须是一个Enum,所以利用这个特性,比如
剪刀 : vs剪刀 平 vs石头 输 vs布 赢
石头 : vs 剪刀 赢 vs石头 平 vs布 输
布 : vs剪刀 输 vs石头 赢 vs布 平
就把vs前面的 放入key中, 然后相对应的结果 在放入一个EnumMap中, 放入的EnumMap中的 key 为vs后面的, 结果为value. 画图其实能理解,不过我不想画,这个不是教学.
2.2 二维数组解决
public enum RoShamBo6 implements Competitor<RoShamBo6>{
PAPER, SCISSORS, ROCK;
private static Outcome[][] table = {
{DRAW, LOSE, WIN},//PAPER
{WIN, DRAW, LOSE},//SCISSORS
{LOSE, WIN, DRAW}//ROCK
};
@Override
public Outcome compete(RoShamBo6 competitor) {
return table[this.ordinal()][competitor.ordinal()];
}
public static void main(String[] args) {
RoShamBo.play(RoShamBo6.class, 20);
}
}
简单明了,我都不想写什么来说明了,就是把石头剪刀布对应的顺序和对手对应的顺序组成下标,和二维数组对应起来,编程思想说这个简单,但是数据大的话不好维护,所以要根据具体的项目来具体分析,还是项目经验太少,很多东西没有完全理解,真的是,程序员换工作真的是逼不得已,只做一个项目不可能成长的,好想做几个大项目.
java 多路分发的更多相关文章
- 【转】Java enum的用法详解
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- Java enum的用法详解[转]
Ref:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html 用法一:常量 在JDK1.5 之前,我们定义常量都是: p ...
- Java enum的用法详解
(转自:http://www.cnblogs.com/happyPawpaw/archive/2013/04/09/3009553.html) 用法一:常量 在JDK1.5 之前,我们定义常量都是: ...
- Java enum(枚举)的用法详解(转)
用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. p ...
- Java NIO 与 基于reactor设计模式的事件处理模型
Java NIO非堵塞应用通常适用用在I/O读写等方面,我们知道,系统运行的性能瓶颈通常在I/O读写,包括对端口和文件的操作上,过去,在打开一个I/O通道后,read()将一直等待在端口一边读取字节内 ...
- 【转】java枚举类型enum的使用
原文网址:http://blog.csdn.net/wgw335363240/article/details/6359614 java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到 ...
- java枚举类型enum的使用
2015-10-24 java达人 Java 中 的枚举类型采用关键字enum 来定义,从jdk1.5才有的新类型,所有的枚举类型都是继承自Enum 类型.要了解枚举类型,建议大家先打开jdk 中的E ...
- java中enum类型的使用
java 枚举类型enum 的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java 中定义的常量值不采用enmu 枚举类型,而采用public final static 类型来定义呢?以前我 ...
- 转载 java枚举类型enum的使用 (原文地址:http://blog.csdn.net/wgw335363240/article/details/6359614)
java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static 类型来定义呢?以前我们都是采 ...
随机推荐
- 4、Android-数据存储方案(文件存储/SharedPreferences)
简介: 任何一个应用程序都需要和数据进行交互 对于软件来说微博.QQ等都需要关系的是数据 没有数据的应用程序是一个没有灵魂的软件 而且还没有实际的用途 可以认为是单机 4.1.持久化技术的简介 数据持 ...
- 1、Android-活动(上)
1.1.活动是什么 活动(Activity)是最容易吸引用户的地方,他是一种可以包含用户界面的组件 主要用于和用户进行交互 一个用户可以包含零个或多个活动,不包含活动的程序少见 1.2.活动的基本用法 ...
- Maven创建项目一些常见的问题
1 .创建的项目中没有src/main/java.没有src/test/java 主要原因在于在创建项目的时候,使用的是系统自带的jdk,修改方法: 右键项目——Properties——javaBui ...
- Reading SBAR SDN flow-Based monitoring and Application Recognition
概要 在sdn下,控制平面基于网络测量的的数据控制网络,而细粒度的管理得益于细粒度的测量数据.针对sdn环境下的细粒度测量(识别具体应用程序),可以实现对细粒度的流量管控. 设计了识别系统SBAR,对 ...
- Linux常用命令拾遗
查看端口对应的程序: netstat -nlap | grep 5004 输出: tcp 0 0 192.168.3.000:5004 192.118.201.00:50800 ESTABLISHED ...
- jquery中的 append , after , prepend , before 区别
jQuery append() 方法在被选元素的结尾插入内容. jQuery prepend() 方法在被选元素的开头插入内容. jQuery after() 方法在被选元素之后插入内容. jQuer ...
- VS Code 的常用快捷键及插件(前端)
一.vs code 的常用快捷键 1.注释: a) 单行注释:[ctrl+k,ctrl+c] 或 ctrl+/ b) 取消单行注释:[ctrl+k,ctrl+u] (按下ctrl不放,再按k + u) ...
- WebGl 一个缓冲区传递颜色和坐标(矩形)
效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- mysql 生成UUID() 即 ORACLE 中的guid()函数
MYSQL 生成UUID 即 guid 函数-- 带 - 的UUIDselect UUID() -- 去掉 - 的UUIDselect replace(uuid(),'-','') 一个表的数据插入另 ...
- linux 命令 sort
Linux下的sort排序命令详解(一) 1 sort的工作原理 sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出. [zook ...