Skip to content

Commit

Permalink
Feat: Implemented a pub/sub design
Browse files Browse the repository at this point in the history
  • Loading branch information
tommyah committed Apr 24, 2026
1 parent b6897ab commit d63b9ba
Show file tree
Hide file tree
Showing 5 changed files with 146 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package edu.ntnu.idi.idatt2003.g40.mappe.service.event;

/**
* Data object sent through the event system by the {@link EventManager}.
*
* @param <T> the type of data this object represents.
* @param eventType the event type this object represents.
* @param data the data this object contains.
*
*/
public record EventData<T>(EventType eventType, T data) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package edu.ntnu.idi.idatt2003.g40.mappe.service.event;

import java.util.ArrayList;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;

/**
* Event broker in the pub/sub model.
*
* <p>Read more about pub/sub
* <a href = "https://www.geeksforgeeks.org/system-design/what-is-pub-sub/">
* Here
* </a>
* </p>
*
* @see EventSubscriber
* @see EventPublisher
*
*/
public final class EventManager {

/**
* Map where key is {@link EventType} and value is list of {@link EventSubscriber} objects.
*
* <p>Used to identify which subscribers to fire the event towards.</p>
*
*/
private final Map<EventType, List<EventSubscriber>> subscriberMap =
new EnumMap<>(EventType.class);

/**
* Method for adding a subscriber to the subscriber map given an event type.
*
* @param subscriber the {@link EventSubscriber} object to add.
* @param eventType the {@link EventType} this subscriber should subscribe to.
*
*
*/
public void addSubscriber(final EventSubscriber subscriber, final EventType eventType) {
subscriberMap.computeIfAbsent(eventType, k -> new ArrayList<>()).add(subscriber);
}

/**
* Method for invoking event to all subscriber of that type.
*
* @param <T> the type of event data to send.
* @param data the data to send.
*
*
*/
public <T> void invokeEvent(final EventData<T> data) {
for (EventSubscriber e : subscriberMap.get(data.eventType())) {
e.handleEvent(data);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package edu.ntnu.idi.idatt2003.g40.mappe.service.event;

/**
* Interface representing a publisher in the pub/sub model (observer pattern).
*
* @see EventManager
* @see EventSubscriber
*/
public interface EventPublisher {

/**
* Method for triggering (invoking) the event.
*
* @param <T> the type of event data to invoke.
* @param data the data to invoke.
* @param eventManager the {@link EventManager} object to use as broker when invoking event.
*/
<T> void invoke(EventData<T> data, EventManager eventManager);
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package edu.ntnu.idi.idatt2003.g40.mappe.service.event;

/**
* Interface representing a subscriber in a pub/sub model.
*
* @see EventManager
* @see EventSubscriber
*/
public interface EventSubscriber {

/**
* Method for handling the event subscribed to.
*
* @param <T> the type of event data to handle.
* @param data the actual data to handle.
*/
<T> void handleEvent(EventData<T> data);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package edu.ntnu.idi.idatt2003.g40.mappe.service.event;

/**
* Enum representing different event types.
*
* <p>Examples:</p>
* <ul>
* <li>Scene changes</li>
* <li>Database operations</li>
* <li>Other</li>
* </ul>
*
*
*/
public enum EventType {

/**
* Event type representing events that causes the current scene to change.
*
* <p>Primarily handled by the active
* {@link edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager} object.</p>
*
* @see edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager
*
*/
SCENE_CHANGE,

/**
* Event type representing events that causes the scene to change to the previous one.
*
* <p>Primarily handled by the active
* {@link edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager} object.</p>
*
* @see edu.ntnu.idi.idatt2003.g40.mappe.view.ViewManager
*
*/
SCENE_BACK,
}

0 comments on commit d63b9ba

Please sign in to comment.