2016-04-14 29 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 
相關問題