2017-10-15 114 views
0

我想用自定義事件在Java中編寫簡單的事件處理解決方案。我只找到基於GUI的例子,到目前爲止使用ActionListeners。我已經包含了一個我用C#編寫的代碼。Java中的事件處理與C#中的事件處理

我想在Java創建這樣的事情:

using System; 
 
using System.Threading; 
 

 
namespace EventHandlingPractice 
 
{ 
 
    class Program 
 
    { 
 
     static void Main(string[] args) 
 
     { 
 
      MusicServer mServer = new MusicServer(); 
 
      Sub subber = new Sub(); 
 

 
      mServer.SongPlayed += subber.SubHandlerMethod; 
 

 
      mServer.PlaySong(); 
 

 
      Console.ReadKey(); 
 
     } 
 
    } 
 

 
    // this class will notify any subscribers if the song was played 
 
    public class MusicServer 
 
    { 
 
     public event EventHandler SongPlayed; 
 

 
     public void PlaySong() 
 
     { 
 
      Console.WriteLine("The song is playing"); 
 
      Thread.Sleep(5000); 
 
      OnSongPlayed(); 
 
     } 
 

 
     protected virtual void OnSongPlayed() 
 
     { 
 
      if (SongPlayed != null) 
 
       SongPlayed(this, EventArgs.Empty); 
 
     } 
 
    } 
 

 
    // this class is class is the subscriber 
 
    public class Sub 
 
    { 
 
     public void SubHandlerMethod(object sender, EventArgs e) 
 
     { 
 
      Console.WriteLine("Notification from: " + sender.ToString() + " the song was played"); 
 
     } 
 
    } 
 
}

+0

您可以按照ActionListeners實現的觀察者模式進行操作。 –

回答

0

在Java中,你通常創建事件本身的類,從EventObject延伸。感興趣的事件在以名稱Listener結尾的界面中定義,擴展界面EventListener

能夠廣播事件的類具有添加/刪除偵聽器方法,其中感興趣方可以註冊自己。

雖然您的代碼在不遵循這些約定的情況下仍能正常工作,但是它們(是?)意味着可用於瞭解類和方法名稱的工具。

這裏爲您的域樣本僞實現:

public class Song { 

} 

public class SongEvent extends EventObject { 
    private final Song song; 

    public SongEvent(Object source, Song song) { 
     super(source); 
     this.song = Objects.requireNonNull(song); 
    } 

    public Song getSong() { 
     return song; 
    } 
} 

public interface SongListener extends EventListener { 
    default void songStarted(SongEvent event) { } 
    default void songPaused(SongEvent event) { } 
} 

public class SongServer { 
    private List<SongListener> listeners = new ArrayList<>(); 

    public void addSongListener(SongListener listener) { 
     listeners.add(listener); 
    } 

    public void removeSongListener(SongListener listener) { 
     listeners.remove(listener); 
    } 

    public void playSong(Song song) { 
     // .... 
     SongEvent event = new SongEvent(this, song); 
     listeners.forEach(l -> l.songStarted(event)); 
    } 
} 

public class MyEventHandler implements SongListener { 
    @Override 
    public void songStarted(SongEvent e) { 
    System.out.printf("Now listening to %s%n", e.getSong().getName()); 
    } 
} 

在Java的早期版本是標準包括Adapter(),這將實現偵聽器接口作爲無操作操作。原因是,如果您要添加從適配器擴展的事件類,則無需添加代碼。使用Java 8,您可以包含默認方法,因此不再需要事件適配器模式。