Revista Tecnología

Patrones de Diseño. Patrón Observador

Publicado el 27 enero 2015 por Instintobinario

Hoy en la serie de patrones de diseño hablamos del patrón Observador.

Propósito

Definir una dependencia entre objetos de forma que cuando un objeto cambie su estado, todos los objetos dependientes son notificados y cambian su estado automáticamente.

Motivación

Un efecto común de dividir un sistema en una colección de clases que cooperan entre sí es la necesidad de mantener la consistencia entre los objetos relacionados. Pero no queremos conseguir esa consistencia acoplando las clases, ya que eso reduciría su reusabilidad.

Si por ejemplo tenemos un objeto que representa una hoja de cálculo y otro que representa un diagrama de barras, éstos pueden representar información en la misma aplicación usando diferentes presentaciones. La hoja de cálculo y el diagrama de barras no se conocen, pero cuando el usuario cambia un dato en la hoja de cálculo, se cambia automáticamente en el diagrama de barras y viceversa.

Patrones de Diseño. Ejemplo Patrón Observador

Ejemplo de uso del patrón Observador

El patrón observador describe cómo establecer este tipo de relaciones. La clave son el sujeto y el observador. Un sujeto puede tener cualquier número de observadores. Todos estos observadores son notificados cuando el sujeto cambia su estado. El tipo de interacción se conoce como publicación-suscripción. El sujeto es el que publica y el observador el que se suscribe.

Aplicabilidad

El patrón observador se usa en cualquiera de estas situaciones:

  • Cuando una abstracción tiene dos puntos de vista dependientes uno del otro. Encapsular estos puntos de vista en objetos separados permite cambiarlos y reutilizarlos.
  • Cuando un cambio en un objeto requiere cambiar otros y no sabemos cuántos objetos van a cambiar.
  • Cuando un objeto debería poder notificar a otros sin saber cuales son esos otros.

Estructura

Patrones de Diseño. Estructura del Patrón Observador

Estructura del patrón Observador

La clase Sujeto conoce a sus observadores. Como he dicho antes, cualquier número de observadores puede observar a un sujeto. Además, proporciona una interfaz para añadir o quitar observadores. La clase Observador define una interfaz para los objetos que deben ser notificados de los cambios del sujeto. La clase ConcreteSubject guarda el estado que es de interés para los observadores. Además, envía una notificación a los observadores cuando si estado cambia. La clase ConcreteObserver tiene una representación del sujeto. Implementa la interfaz con el método para actualizar su estado y así poder mantenerlo consistente con el del sujeto.

Consecuencias

Los beneficios de este patrón son los siguientes:

  • Acoplamiento abstracto entre el sujeto y el observador: El sujeto no conoce la clase concreta de cada observador, los conoce a través de la interfaz. Por tanto el acoplamiento es abstracto y mínimo.
  • Soporte para la comunicación: La notificación que envía el sujeto no necesita saber su receptor. La notificación se envía automáticamente a todos los observadores. Al sujeto no le importa cuántos observadores haya, su única responsabilidad es notificarlos. Esto nos da la libertad de añadir o eliminar observadores cuando queramos.

Como pega del patrón tenemos la siguiente:

  • Actualizaciones inesperadas: Debido a que los observadores no conocen a otros observadores, pueden no conocer el coste de cambiar de sujeto. Una operación aparentemente inofensiva en el sujeto puede resultar en una cascada de actualizaciones en los observadores.

Usos conocidos

Un uso conocido puede ser el mostrado al principio de las hojas de cálculo. Otro uso conocido es en el patrón arquitectónico Modelo Vista Controlador (MVC).

El artículo Patrones de Diseño. Patrón Observador. apareció por primera vez en Instinto Binario.

Patrones de Diseño. Patrón Observador.


Volver a la Portada de Logo Paperblog

Revista