Patrón Observador — demo visual

El Subject mantiene un estado (un “mensaje”). Los Observers se suscriben. Cuando el Subject cambia, notifica a los observers activos y todos se actualizan.

Diagrama: flujo de notificación

Al hacer notify(), las flechas “viajan” a cada observer suscrito
Subject Observer state idle

Subject

notifica()
Estado actual (vacío)

Observers

update(state)

Ejemplo del patrón (Observer)

código

<b>Subject</b> mantiene una lista de <b>Observers</b> y los notifica cuando cambia su estado.

// observer.ts

interface IObserver {
  update(state: string): void;
}

class Subject {
  private observers = new Set<IObserver>();
  private state = "";

  attach(o: IObserver) { this.observers.add(o); }
  detach(o: IObserver) { this.observers.delete(o); }

  setState(next: string) {
    this.state = next;
    this.notify();
  }

  notify() {
    for (const o of this.observers) o.update(this.state);
  }
}

class Observer implements IObserver {
  constructor(private name: string) {}
  update(state: string) {
    console.log(this.name + " received: " + state);
  }
}

const subject = new Subject();
const a = new Observer("Observer A");
const b = new Observer("Observer B");

subject.attach(a);
subject.attach(b);
subject.setState("new-state");
// observer.js

class Subject {
  constructor() {
    this.state = "";
    this.observers = new Set();
  }
  attach(o) { this.observers.add(o); }
  detach(o) { this.observers.delete(o); }
  setState(next) {
    this.state = next;
    this.notify();
  }
  notify() {
    for (const o of this.observers) o.update(this.state);
  }
}

class Observer {
  constructor(name) { this.name = name; }
  update(state) {
    console.log(this.name + " received: " + state);
  }
}

const subject = new Subject();
const a = new Observer("Observer A");
const b = new Observer("Observer B");

subject.attach(a);
subject.attach(b);
subject.setState("new-state");
La demo de esta página usa JS “vanilla” para interactuar con la UI, pero el contrato del patrón se ve igual en TS.