2017-10-15 8 views
0

Java에서 간단한 이벤트 처리 솔루션을 사용자 지정 이벤트로 작성하려고합니다. 지금까지 ActionListeners를 사용하여 GUI 기반 예제 만 찾았습니다. 나는 C#으로 쓴 코드를 포함시켰다.Java에서 이벤트 처리 C#에서

나는 자바 같은 것을 만들려면 :

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

자바에서는 일반적으로 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()); 
    } 
} 

이 포함 표준이었던없는 연산 작업으로 리스너 인터페이스를 구현하는 것이 Adapter (SongAdapter). 그 이유는 어댑터에서 확장 한 이벤트 클래스를 추가하면 코드를 추가 할 필요가 없기 때문입니다. Java 8에서는 기본 메소드를 포함 할 수 있으므로 이벤트 어댑터 패턴은 더 이상 필요하지 않습니다.