贪吃蛇步骤中,蛇每移动一步实现一个监听,但我没有听明白怎么回事,现在放这里求解,希望大家给小弟解释下,谢谢了步骤如下: 一:  interface SnakeListener { void snakemove(Snake snake);}   // 我理解为是一个接口
           二:  Set<SnakeListener>  listener = new HashSet<SnakeListener>(); // 我理解为是个泛型
           三:   public void addSnakeListener(){}//别人讲是个实现监听器的方法
我想问,这三个有什么关系吗?  我只知道监听器本来就是个接口类,但是把放到<SnakeListener>里面成啥了
    

解决方案 »

  1.   

    有关系
    首先,三 理解错了,三 是事件监听管理者对监听器的管理(添加监听器)
    Set<SnakeListener> listener = new HashSet<SnakeListener>();
    是事件监听管理者的一个监听器集合,用于保存需要回调的监听器
    public void addSnakeListener(){}是事件监听管理者的一个方法,用于把需要回调的监听器保存到listener集合中当事件监听管理者监测到某个事件被触发或者自己触发(如果事件监听管理者本事是事件发生源)后,会调用
    Snake snake = new Snake(); //如果监听管理者本身是Snake对象,那么可以 Snake snake = this;
    for (SnakeListener sl : listener) { //然后调用监听器集合的所有监听器
        sl.snakemove(snake); //这样添加到事件监听管理者的监听器都会被回调
    }首先你要理解好这些对象的关系
    假如 A是事件监听管理者,那么A拥有上面的二和三
    B是监听器的某个实现,那么B实现 一
    C是某个程序,它需要使用B,并且需要A触发某事件时调用B,那么
    class C {
        public static void main(String[] args) {
            A a = new A();
            SnakeListner b = new SnakeListener() {
                public void snakemove(Snake snake) {System.out.println("A触发某事件时请调用我");}
            };
            a.addSnakeListener(b); //把监听器加入到事件源监听中 
            //这样A监测到某事件触发或者自己触发某事件后,就会调用b
        }
    }
    举个例子
    A是某个宿舍管理员,Lz你是C,你去找某人,他不在宿舍,于是你想到,希望某人回到宿舍后让A通知你
    ,这样你就告诉A说"如果某人回来后叫我一声",这里就是C调用A.addSnakeLienter(b)方法,把你需要管理员监听到某个事件时要做的事情告诉管理员,其中事件就是某人回到宿舍,管理员要做的事情就是b,b需要实现监听器的接口方法,也就是“叫你一声”