from abc import ABC, abstractmethod
from dataclasses import dataclass
from typing import List
class Observer(ABC):
@abstractmethod
def on_event(self, event: str) -> None:
pass
class Subject(ABC):
def __init__(self):
self._observers: List[Observer] = []
def attach(self, observer: Observer) -> None:
if observer not in self._observers:
self._observers.append(observer)
def detach(self, observer: Observer) -> None:
self._observers.remove(observer)
@abstractmethod
def notify(self) -> None:
pass
@dataclass
class ConcreteObserver(Observer):
name: str
def on_event(self, event: str) -> None:
print(f"{self.name} received event: {event}")
class EventManager(Subject):
def __init__(self):
super().__init__()
self._event_queue: List[str] = []
def add_event(self, event: str) -> None:
self._event_queue.append(event)
self.notify()
def notify(self) -> None:
for event in self._event_queue:
for observer in self._observers:
observer.on_event(event)
self._event_queue.clear()
event_manager = EventManager()
def create_observer(name: str) -> ConcreteObserver:
return ConcreteObserver(name=name)
class Configuration:
def __init__(self):
self.debug_mode = False
self.max_observers = 100
config = Configuration()