Observer & Singleton Patterns
How should the Observer Pattern be implemented to handle different types of events?
class EventSubject {
#handlers = new Map();
on(eventType, handler) {
if (!this.#handlers.has(eventType)) {
this.#handlers.set(eventType, new Set());
}
this.#handlers.get(eventType).add(handler);
return () => this.off(eventType, handler);
}
off(eventType, handler) {
const handlers = this.#handlers.get(eventType);
if (handlers) {
handlers.delete(handler);
if (handlers.size === 0) {
this.#handlers.delete(eventType);
}
}
}
emit(eventType, data) {
this.#handlers.get(eventType)?.forEach(handler => handler(data));
}
}