Observer

Define una dependencia uno-a-muchos para notificar a múltiples objetos cuando uno cambia.

Contexto

Cuando el precio de un producto cambia, varios componentes deben reaccionar (cache, vista, alertas, métricas).

Problema
  • Llamar a todos desde el productor lo acopla a cada consumidor.
  • Cada nuevo consumidor obliga a tocar al productor.
Solución

El sujeto mantiene una lista de observadores y los notifica; cada observador implementa una interfaz común.

#Ejemplo en C# — event

public class PriceFeed
{
    public event EventHandler<decimal>? PriceChanged;
    public void Update(decimal p) => PriceChanged?.Invoke(this, p);
}

public class Logger
{
    public Logger(PriceFeed feed) => feed.PriceChanged += (_, p) => Console.WriteLine(
quot;Precio: {p}"); }

En C#, event + EventHandler o IObservable<T> ya implementan Observer.

Cuándo NO aplicarlo
  • Cuando hay un único observador: una llamada directa es más clara.
  • Cuando el orden de notificación importa: vuelve impredecible.
Tradeoffs
Pro Contra
Desacopla productor y consumidor Difícil seguir el flujo en debug
Permite añadir consumidores sin tocar productor Riesgo de memory leaks por handlers no removidos

#Variantes

  • Push (envía datos al observador) vs Pull (notifica y el observador consulta).
  • IObservable<T> / Rx (reactive streams).

#behavioral #gof #events