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)
|