forked from UNN/2026-rff_mp
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
"""
|
||
Создать интерфейс Observer с методом update(event),
|
||
где event может быть строкой или объектом с типом события ("path_found", "move", "maze_loaded").
|
||
"""
|
||
|
||
from enum import Enum
|
||
from abc import ABC, abstractmethod
|
||
|
||
class MazeEventType(Enum):
|
||
PATH_FOUND = "path_found"
|
||
MOVE = "move"
|
||
MAZE_LOADED = "maze_loaded"
|
||
|
||
class MazeEvent:
|
||
data=None
|
||
def __init__(self, evtype: MazeEventType, data=None):
|
||
if not isinstance(evtype, MazeEventType):
|
||
raise TypeError(f"evtype must be an EventType, got {type(evtype)}")
|
||
self.evtype = evtype
|
||
self.data = data
|
||
|
||
class Observer(ABC):
|
||
@abstractmethod
|
||
def update(self, event: MazeEvent):
|
||
raise NotImplementedError
|
||
|
||
|
||
class Subject(ABC):
|
||
"""Издатель: управляет подписчиками и отправляет им уведомления."""
|
||
def __init__(self):
|
||
self._observers:set[Observer] = set()
|
||
|
||
def attach(self, obs:Observer):
|
||
"Подписать наблюдателя"
|
||
self._observers.add(obs)
|
||
|
||
def detach(self, obs:Observer):
|
||
"Отписать наблюдателя"
|
||
self._observers.discard(obs)
|
||
|
||
def notify(self, event:MazeEvent):
|
||
for obs in self._observers:
|
||
obs.update(event) |