• 关于石头剪刀布的模拟程序(二路分发)


    二路分发(java 编程思想中这么说的)。

    还是没有理解,我对这个设计的理解就是将本应该instanceof实现的功能替换成使用多态来实现。

    下面是两个版本,第一个是我使用instanceof的实现,第二个是java编程思想中使用多态的实现。

    公共的结果枚举:

    package test2;
    public enum Outcome {
        WIN,LOSE,DRAW
    }

    我的实现(使用instanceof):

    package test2;
    import static test2.Outcome.DRAW;
    import static test2.Outcome.LOSE;
    import static test2.Outcome.WIN;
    
    import java.util.Random;
    /**
     * 
     * 我自己的石头剪刀布实现
     *
     */
    interface MyItem {
        Outcome compete(MyItem m ) ;
    }
    class MyPaper implements MyItem {
        @Override
        public Outcome compete(MyItem m) {
            if(m instanceof MyPaper ){
                return DRAW ;
            }
            if(m instanceof MyScissors ){
                return LOSE ;
            }
            if(m instanceof MyRock ){
                return WIN ;
            }
            return DRAW ;
        }
        @Override
        public String toString() {
            return "Paper" ;
        }
    }
    class MyScissors implements MyItem {
        @Override
        public Outcome compete(MyItem m) {
            if(m instanceof MyPaper ){
                return WIN ;
            }
            if(m instanceof MyScissors ){
                return DRAW ;
            }
            if(m instanceof MyRock ){
                return LOSE ;
            }
            return DRAW ;
        }
        @Override
        public String toString() {
            return "Scissors" ;
        }
    }
    class MyRock implements MyItem {
        @Override
        public Outcome compete(MyItem m) {
            if(m instanceof MyPaper ){
                return LOSE ;
            }
            if(m instanceof MyScissors ){
                return WIN ;
            }
            if(m instanceof MyRock ){
                return DRAW ;
            }
            return DRAW ;
        }
        @Override
        public String toString() {
            return "Rock" ;
        }
    }
    public class MyRoShamBo {
        private static Random random = new Random(47) ;
        /**
         * 随机产生输出
         * @return 输出对象 
         */
        public static MyItem randomItem(){
            int item = random.nextInt(3) ;
            switch(item){
            case 0 :
                return new MyPaper() ;
            case 1 :
                return new MyScissors() ;
            case 2 :
                return new MyRock() ;
            default :
                throw new RuntimeException("随机产生出现异常 !") ;
            }
        }
        public static void main(String[] args) {
            for(int i = 0 ; i < 10 ; i ++){
                MyItem one = randomItem() ;
                MyItem two = randomItem() ;
                System.out.println(one + " : "  + two + " " + one.compete(two));
            }
        }
    }

    多态的实现:

    package test2;
    import static test2.Outcome.* ;
    
    import java.util.Random;
    interface Item {
        Outcome compete(Item i ) ;
        /**
         * 将当前对象与Paper进行比较 
         * @param p Paper对象 
         * @return 比较结果
         */
        Outcome eval(Paper p ) ;
        Outcome eval(Scissors s ) ;
        Outcome eval(Rock r ) ;
    }
    class Paper implements Item {
        @Override
        public Outcome compete(Item i) {
            /**
             * 现在考虑调用时的情形:
             * Item a = new Paper() ;
             * Item b = new Paper() ;
             * a.compete(b) ;
             * 当在a中执行complete方法时,this的类型已经确定,不是Item接口类型,而是具体实现类类型。
             * 但是传递进来的b已经被向上转型为Item类型,所以在使用this.eval(b)时会出现参数类型不匹配的问题。
             * 当使用b.eval(this)时就可以了,这时b通过多态的机制调用了适用于this的重载的eval方法。
             * java编程思想上说的是:
             * 将自身(this)作为参数调用eval(),能够调用重载过的eval()方法,这能够保留第一次分发的类型信息。
             */
            return i.eval(this) ;
            //The method eval(Paper) in the type Paper is not applicable for the arguments (Item)
            //this.eval(i) ;
        }
        @Override
        public Outcome eval(Paper p) {
            return DRAW ;
        }
        @Override
        public Outcome eval(Rock r) {
            return WIN ;
        }
        @Override
        public Outcome eval(Scissors s) {
            return LOSE ;
        }
    }
    class Scissors implements Item {
        @Override
        public Outcome compete(Item i) {
            return i.eval(this) ;
        }
        @Override
        public Outcome eval(Paper p) {
            return WIN ;
        }
        @Override
        public Outcome eval(Rock r) {
            return LOSE ;
        }
        @Override
        public Outcome eval(Scissors s) {
            return DRAW ;
        }
    }
    class Rock implements Item {
        @Override
        public Outcome compete(Item i) {
            return i.eval(this) ;
        }
        @Override
        public Outcome eval(Paper p) {
            return LOSE ;
        }
        @Override
        public Outcome eval(Rock r) {
            return DRAW ;
        }
        @Override
        public Outcome eval(Scissors s) {
            return WIN ;
        }
    }
    public class RoShamBo {
        private static Random random = new Random(47) ;
        /**
         * 随机产生输出
         * @return 输出对象 
         */
        public static MyItem randomItem(){
            int item = random.nextInt(3) ;
            switch(item){
            case 0 :
                return new MyPaper() ;
            case 1 :
                return new MyScissors() ;
            case 2 :
                return new MyRock() ;
            default :
                throw new RuntimeException("随机产生出现异常 !") ;
            }
        }
        public static void main(String[] args) {
            for(int i = 0 ; i < 10 ; i ++){
                MyItem one = randomItem() ;
                MyItem two = randomItem() ;
                System.out.println(one + " : "  + two + " " + one.compete(two));
            }
        }
    }
  • 相关阅读:
    java第四次作业
    java第五次作业
    java第三次作业
    第二次学习笔记
    java学习笔记
    第十四周完成情况
    课程计划进程
    课程设计分工
    JAVA学习笔记(六)
    JAVA学习笔记(五)
  • 原文地址:https://www.cnblogs.com/caiyao/p/4693838.html
Copyright © 2020-2023  润新知