Cum Să Implementezi Observer Pattern — Evenimente și Notificări
In this tutorial, you'll learn about Cum Să Implementezi Observer Pattern. We cover key concepts, practical examples, and best practices.
Vei învăța cum să implementezi Observer pattern pentru a gestiona evenimente și notificări în aplicații, permițând obiectelor să reacționeze la schimbări de stare.
Problema
Când un obiect își schimbă starea, alte obiecte trebuie să fie notificate. Fără Observer pattern, codul devine strâns cuplat și greu de extins — fiecare notificare necesită modificarea sursei.
Abordarea Greșită
Notificarea directă a fiecărui dependent în codul sursei.
// Greșit: cuplare strânsă
class DataStore {
private Database db;
private Logger logger;
private Cache cache;
void save(String data) {
db.save(data); // dependență directă
logger.log(data); // dependență directă
cache.invalidate();// dependență directă
}
}
Abordarea Corectă
Folosește Observer pattern pentru notificări decuplate.
from abc import ABC, abstractmethod
class Observer(ABC):
@abstractmethod
def update(self, data):
pass
class Subject:
def __init__(self):
self._observers = []
def attach(self, observer: Observer):
self._observers.append(observer)
def detach(self, observer: Observer):
self._observers.remove(observer)
def notify(self, data):
for observer in self._observers:
observer.update(data)
class DataStore(Subject):
def save(self, data):
print(f"Date salvate: {data}")
self.notify(data)
Rezolvare Pas cu Pas
1. Definește interfața Observer
class EventListener(ABC):
@abstractmethod
def on_event(self, event_type: str, data: dict):
pass
2. Implementează Subject-ul
class EventManager:
def __init__(self):
self._listeners = {}
def subscribe(self, event_type: str, listener: EventListener):
if event_type not in self._listeners:
self._listeners[event_type] = []
self._listeners[event_type].append(listener)
def unsubscribe(self, event_type: str, listener: EventListener):
self._listeners[event_type].remove(listener)
def emit(self, event_type: str, data: dict):
for listener in self._listeners.get(event_type, []):
listener.on_event(event_type, data)
3. Creează observatori concreți
class EmailNotifier(EventListener):
def on_event(self, event_type: str, data: dict):
print(f"Email trimis pentru {event_type}: {data}")
class Logger(EventListener):
def on_event(self, event_type: str, data: dict):
print(f"[LOG] {event_type}: {data}")
4. Folosește pattern-ul
manager = EventManager()
manager.subscribe("user_registered", EmailNotifier())
manager.subscribe("user_registered", Logger())
manager.emit("user_registered", {"email": "user@example.com"})
Sfaturi de Prevenție
- Folosește weak references pentru a preveni memory leaks
- Nu face operații blocante în observatori (consideră async)
- Documentează ordinea de execuție a observatorilor
Greșeli Comune
- Memory leaks din cauza observatorilor care nu sunt dezabonați
- Notificări în buclă infinită (observatorul modifică sursa care notifică din nou)
- Ordinea de execuție a observatorilor este impredictibilă
- Operații grele în observatori care blochează sursa
- Prea multe evenimente — notificări pentru orice schimbare minoră
Întrebări Frecvente
Construit de dezvoltatorii Doda Browser, DodaZIP și Durga Antivirus Pro. Uneltele DodaTech folosesc Observer pattern pentru monitorizare în timp real.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro