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+EventHandleroIObservable<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