Para utilizar todas las funcionalidades que ofrece este sitio, es necesario tener JavaScript habilitado.

Regresemos al tema de patrones de diseño. Varias semanas atrás, estuve tocando el patrón Decorador y la Inyección de dependencias. Hoy voy a escribir acerca del Patrón Observador (Observer en inglés), quizás uno de mis favoritos. También se le conoce como el patrón de Publicación - Inscripción.

El patrón observador, es flexible y sencillo. Se utiliza cuando uno quiere notificar a otros objetos de un evento. En principio, lo que sucede es que un Objeto (llamemoslo Observador) se inscribe a otro Objeto (llamemoslo Sujeto) y este le avisa cuando un evento es disparado (o cuando el estado del Sujeto ha cambiado).

Se pueden inscribir varios Observadores, en ese caso (generalmente) la notificación del cambio de estado va de acuerdo al orden en como se suscribieron los Observadores.

A partir de PHP 5.1, hay unas interfaces en la librería estándar que nos ayudan a implementarlo con gran facilidad. Estoy hablando de las Interfaces SplSubject y SplObserver.

Ejemplo: Fútbol

Imaginemos que tenemos una aplicación que nos da el marcador de un partido de fútbol. Nosotros queremos que cada vez que haya un gol, nos envíe un email con el marcador y que adicionalmente lo escriba en un archivo local.

Sencillo, cierto? Como podrás ver, también existe la posibilidad de quitar observadores de un sujeto con el método detach.

Ejemplo: Crear Usuarios

Tenemos un sistema para crear usuarios. Queremos que nos lleguen avisos cada vez que un usuario sea registrado.

En esta oportunidad voy a usar el objeto SplObjectStorage (también de la librería estandar) para que se encargue de la adición y sustracción de Observadores.

Ejemplo: Camisas

En este último ejemplo, tenemos una aplicación para vender y comprar camisas. Queremos notificar cada vez que hayan compras o ventas.

En este último ejemplo se puede ver, que también es posible crear un contexto para notificar a los demás observadores.

Ventajas y Desventajas

La principal ventaja de este patrón es que todo se logra sin recurrir a un acoplamiento estrecho. El sujeto solo sabe de una lista de observadores y en una sola llamada los notifica. Al sujeto no le interesa los efectos o desenlaces de los observadores, él simplemente emite. El resultado es código flexible y reusable.

La única desventaja apreciable, aparece cuando un observador es demasiado grande. Eso puede traer consecuencias en el uso de memoria.

Otra posible desventaja aparece cuando se inscribe un observador que a su vez sea un sujeto para otros objetos. Si la implementación no es limpia, será muy difícil corregir o encontrar errores cuando estos sucedan.

Algún error en la entrada? Házmelo saber en los comentarios! Si tienes dificultades viendo el código, puedes ir a https://gist.github.com/mpratt/5760231. Todos los ejemplos funcionaron sin problema en PHP 5.4.

Nuevamente, Gracias por leer!

Comentarios