Skip to content

Cum Să Implementezi Observer Pattern — Evenimente și Notificări

DodaTech Updated 2025-01-15 2 min read

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

  1. Memory leaks din cauza observatorilor care nu sunt dezabonați
  2. Notificări în buclă infinită (observatorul modifică sursa care notifică din nou)
  3. Ordinea de execuție a observatorilor este impredictibilă
  4. Operații grele în observatori care blochează sursa
  5. Prea multe evenimente — notificări pentru orice schimbare minoră

Întrebări Frecvente

### Ce este Observer pattern?

Observer pattern definește o relație de tip one-to-many între obiecte, astfel încât când un obiect își schimbă starea, toate dependințele sale sunt notificate automat.

Cum diferă Observer de Event Emitter?

Observer pattern e o abstractizare mai generală, în timp ce Event Emitter e o implementare specifică, popularizată de Node.js, care folosește nume de evenimente.

Când ar trebui să evit Observer pattern?

Când ai puține notificări sau când cuplarea directă e acceptabilă. Pentru sisteme complexe de evenimente, consideră un message broker.

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