zoukankan      html  css  js  c++  java
  • 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);
        }
        
    
    }

    简单明了,我都不想写什么来说明了,就是把石头剪刀布对应的顺序和对手对应的顺序组成下标,和二维数组对应起来,编程思想说这个简单,但是数据大的话不好维护,所以要根据具体的项目来具体分析,还是项目经验太少,很多东西没有完全理解,真的是,程序员换工作真的是逼不得已,只做一个项目不可能成长的,好想做几个大项目.

  • 相关阅读:
    putty如何退出全屏模式
    maven项目如何生成war文件
    使用web.xml方式加载Spring时,获取Spring context的两种方式
    Mybatis 示例之 SelectKey
    psql主主复制
    【转】angular使用代理解决跨域
    Error: EACCES: permission denied when trying to install ESLint using npm
    Run Code Once on First Load (Concurrency Safe)
    [转]对于BIO/NIO/AIO,你还只停留在烧开水的水平吗
    golang 时间的比较,time.Time的初始值?
  • 原文地址:https://www.cnblogs.com/lishuaiqi/p/10673613.html
Copyright © 2011-2022 走看看