terminal

codeando_simple

terminal

menu

terminal

search_module

guest@codeandosimple: ~/system/search $ grep -r "" .

Press [ENTER] to execute search

Status

Engine: Ready

Database: Online

Index: V2.1.0_LATEST

bash — cat observer.md
guest@codeandosimple: ~/blog/design-patterns $ cat observer.md

Observer Pattern_

// "La educación es el arma más poderosa que puedes usar para cambiar el mundo. Estudia con pasión y propósito, y sé el cambio que deseas ver en el mundo" - Dalai Lama

# Propósito

Establece una relación de suscripción donde los objetos (observadores) son notificados automáticamente de cualquier cambio en el estado de otro objeto (sujeto).

# Problema

  • Acoplamiento Sujeto-Observador: Necesidad de notificar cambios sin que el sujeto conozca las clases concretas receptoras.

  • Actualización Dinámica: Objetos que necesitan monitorear estados que varían en el tiempo.

# Solución

  • Suscripción: Los observadores se registran o desregistran voluntariamente.

  • Notificación Automática: El sujeto itera sus suscriptores y llama a su método de actualización tras un cambio.

# Estructura

Estructura UML Observer

# Participantes

  • Subject: Interfaz para registro y notificación.
  • ConcreteSubject: El objeto de interés con estado cambiante.
  • Observer: Interfaz con el método update().
  • ConcreteObserver: El suscriptor que reacciona a cambios.

# Cuándo Usarlo

Cuando el cambio en un objeto requiere cambios en otros desconocidos a priori, o cuando la lista de interesados es dinámica.

# Ventajas

  • verified

    Desacoplamiento: Sujetos y observadores evolucionan por separado.

  • verified

    Broadcast: Notificación simultánea a múltiples clases.

# Desventajas

  • warning

    Actualización Innecesaria: Recibir avisos no relevantes.

  • warning

    Memory Leak: Si no se desvinculan los suscriptores.

# Ejemplo: Alerta Meteorológica

Estación de clima (Sujeto) que notifica a Apps móviles y servicios de noticias (Observadores).

Ejemplo Observer Clima

# Código Java

interface Subject {
    void register(Observer o);
    void notifyObservers();
}

class WeatherData implements Subject {
    private List<Observer> obs = new ArrayList<>();
    public void notifyObservers() {
        for (Observer o : obs) o.update(temp, hum, press);
    }
}

# Mapeo Participantes

  • WeatherData: ConcreteSubject.
  • MobileApp: ConcreteObserver.
  • Service: Client.

# Conclusiones

Es la base de los sistemas reactivos y permite una arquitectura altamente extensible frente a nuevos requerimientos de monitoreo.

# Patrones relacionados

Mediator

Para coordinar comunicación entre objetos complejos.

Singleton

Para asegurar un observador central o un único sujeto global.