mirror of
https://github.com/jneug/zeichenmaschine.git
synced 2026-04-14 06:33:34 +02:00
Abstraktion für Listener API erstellt
EventGenerator soll als einheitlicher Unterbau zur Umstzung von Listener Patterns dienen. Damit sollen Listener wie AudioListener oder AnimationListener umgesetzt werden.
This commit is contained in:
50
src/schule/ngb/zm/events/EventGenerator.java
Normal file
50
src/schule/ngb/zm/events/EventGenerator.java
Normal file
@@ -0,0 +1,50 @@
|
||||
package schule.ngb.zm.events;
|
||||
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import java.util.concurrent.CopyOnWriteArraySet;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
public class EventGenerator<E, L extends Listener<E>> {
|
||||
|
||||
private CopyOnWriteArraySet<L> listeners;
|
||||
|
||||
private ConcurrentMap<String, BiConsumer<E, L>> eventRegistry;
|
||||
|
||||
public EventGenerator() {
|
||||
listeners = new CopyOnWriteArraySet<>();
|
||||
eventRegistry = new ConcurrentHashMap<>();
|
||||
}
|
||||
|
||||
public void registerEventType( String eventKey, BiConsumer<E, L> dispatcher ) {
|
||||
if( !eventRegistered(eventKey) ) {
|
||||
eventRegistry.put(eventKey, dispatcher);
|
||||
}
|
||||
}
|
||||
|
||||
public void addListener( L listener ) {
|
||||
listeners.add(listener);
|
||||
}
|
||||
|
||||
public void removeListener( L listener ) {
|
||||
listeners.remove(listener);
|
||||
}
|
||||
|
||||
public boolean hasListeners() {
|
||||
return !listeners.isEmpty();
|
||||
}
|
||||
|
||||
public boolean eventRegistered( String eventKey ) {
|
||||
return eventRegistry.containsKey(eventKey);
|
||||
}
|
||||
|
||||
public void dispatchEvent( String eventKey, final E event ) {
|
||||
if( eventRegistered(eventKey) ) {
|
||||
final BiConsumer<E, L> dispatcher = eventRegistry.get(eventKey);
|
||||
listeners.stream().forEach(( listener ) -> {
|
||||
dispatcher.accept(event, listener);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
7
src/schule/ngb/zm/events/Listener.java
Normal file
7
src/schule/ngb/zm/events/Listener.java
Normal file
@@ -0,0 +1,7 @@
|
||||
package schule.ngb.zm.events;
|
||||
|
||||
public interface Listener<E> {
|
||||
|
||||
|
||||
|
||||
}
|
||||
65
test/src/schule/ngb/zm/events/EventGeneratorTest.java
Normal file
65
test/src/schule/ngb/zm/events/EventGeneratorTest.java
Normal file
@@ -0,0 +1,65 @@
|
||||
package schule.ngb.zm.events;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
class EventGeneratorTest {
|
||||
|
||||
class TestEvent {
|
||||
|
||||
private String data;
|
||||
|
||||
private String type;
|
||||
|
||||
public TestEvent( String data, boolean isStart ) {
|
||||
this.data = data;
|
||||
this.type = isStart ? "start" : "stop";
|
||||
}
|
||||
|
||||
public String getData() {
|
||||
return data;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
interface TestListener extends Listener<TestEvent> {
|
||||
|
||||
void startEvent( TestEvent t );
|
||||
|
||||
void stopEvent( TestEvent t );
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
void eventRegistry() {
|
||||
EventGenerator<TestEvent, TestListener> gen = new EventGenerator<>();
|
||||
|
||||
gen.registerEventType("start", ( event, listener ) -> listener.startEvent(event));
|
||||
gen.registerEventType("stop", ( event, listener ) -> listener.stopEvent(event));
|
||||
|
||||
gen.addListener(new TestListener() {
|
||||
@Override
|
||||
public void startEvent( TestEvent t ) {
|
||||
assertEquals("start", t.getType());
|
||||
assertTrue(t.getData().startsWith("Start Event"));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void stopEvent( TestEvent t ) {
|
||||
assertEquals("stop", t.getType());
|
||||
assertTrue(t.getData().startsWith("Stop Event"));
|
||||
}
|
||||
});
|
||||
|
||||
gen.dispatchEvent("start", new TestEvent("Start Event 1", true));
|
||||
gen.dispatchEvent("stop", new TestEvent("Stop Event 1", false));
|
||||
gen.dispatchEvent("stop", new TestEvent("Stop Event 2", false));
|
||||
gen.dispatchEvent("start", new TestEvent("Start Event 2", true));
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user