2016-04-14 65 views
1

答案here显示了在java中创建自定义事件的方式。我明白了答案,但我想知道他为什么使用HelloListener界面?我不认为这是必要的。为什么我们在java中创建自定义事件时使用接口?

我的代码:

import java.util.ArrayList; 
import java.util.List; 

class Initiater { 
    private List<Responder> listeners = new ArrayList<Responder>(); 

    public void addListener(Responder toAdd) { 
     listeners.add(toAdd); 
    } 

    public void sayHello() { 
     System.out.println("Hello!!"); 

     for (Responder hl : listeners) 
      hl.someoneSaidHello(); 
    } 
} 

class Responder { 
    public void someoneSaidHello() { 
     System.out.println("Hello there..."); 
    } 
} 

public class Test { 
    public static void main(String[] args) { 
     Initiater initiater = new Initiater(); 
     Responder responder = new Responder(); 
     initiater.addListener(responder); 
     initiater.sayHello(); 
    } 
} 

我觉得我写的代码做同样的事情。我可以这样做吗?

回答

3

可以这样做,但它不是很好的设计。使用接口的原因是解耦行为。如果只有一个实现并且该实现直接来自“启动器”,则不需要使用监听器。监听者的目的是将其解耦:“启动者”不知道监听者可能做什么或监听者可能是什么(即它的类)。由于Java是静态类型的,所以必须定义一个接口。然后,监听器的实现可以分开。它甚至可以在单独的项目中并单独编译(例如,创建库时)。

0

接口将使您拥有多种风格的监听器。

interface HelloListener { 
    void someoneSaidHello(); 
} 

class Responder implements HelloListener { 
    @Override 
    public void someoneSaidHello() { 
     System.out.println("Hello there..."); 
    } 
} 

class AnotherResponder implements HelloListener { 
    @Override 
    public void someoneSaidHello() { 
     System.out.println("Hello from Responder 2"); 
    } 
} 

initiater.add(new Responder()); 
initiater.add(new AnotherResponder()); 

调用

initiater.sayHello(); 

现在将输出

Hello there... 
Hello from Responder 2 
相关问题