forked from UNN/2026-rff_mp
39 lines
993 B
Python
39 lines
993 B
Python
|
|
from abc import ABC, abstractmethod
|
||
|
|
from typing import Any
|
||
|
|
from enum import Enum, auto
|
||
|
|
|
||
|
|
class EventType(Enum):
|
||
|
|
MAZE_LOADED = auto()
|
||
|
|
PATH_FOUND = auto()
|
||
|
|
PATH_NOT_FOUND = auto()
|
||
|
|
PLAYER_MOVED = auto()
|
||
|
|
SEARCH_START = auto()
|
||
|
|
SEARCH_END = auto()
|
||
|
|
ERROR = auto()
|
||
|
|
UNDO = auto()
|
||
|
|
|
||
|
|
class Event:
|
||
|
|
def __init__(self, event_type: EventType, data: Any = None):
|
||
|
|
self.event_type = event_type
|
||
|
|
self.data = data
|
||
|
|
|
||
|
|
class Observer(ABC):
|
||
|
|
@abstractmethod
|
||
|
|
def update(self, event: Event):
|
||
|
|
pass
|
||
|
|
|
||
|
|
class Observable:
|
||
|
|
def __init__(self):
|
||
|
|
self._observers = []
|
||
|
|
|
||
|
|
def attach(self, observer: Observer):
|
||
|
|
if observer not in self._observers:
|
||
|
|
self._observers.append(observer)
|
||
|
|
|
||
|
|
def detach(self, observer: Observer):
|
||
|
|
if observer in self._observers:
|
||
|
|
self._observers.remove(observer)
|
||
|
|
|
||
|
|
def notify(self, event: Event):
|
||
|
|
for observer in self._observers:
|
||
|
|
observer.update(event)
|