1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| interface Event {}
class MessageEvent implements Event { private final String message;
public MessageEvent(String message) { this.message = message; }
public String getMessage() { return message; } }
interface Subscriber<T extends Event> { void onEvent(T event); }
class EventBus { private final Map<Class<? extends Event>, List<Subscriber<? extends Event>>> subscribers = new HashMap<>();
public <T extends Event> void subscribe(Class<T> eventType, Subscriber<T> subscriber) { subscribers.computeIfAbsent(eventType, k -> new ArrayList<>()).add(subscriber); }
public <T extends Event> void publish(T event) { List<Subscriber<? extends Event>> eventSubscribers = subscribers.get(event.getClass()); if (eventSubscribers != null) { for (Subscriber<? extends Event> sub : eventSubscribers) { @SuppressWarnings("unchecked") Subscriber<T> typedSub = (Subscriber<T>) sub; typedSub.onEvent(event); } } } }
|