| Selector de colores |
| Paso 3: Patrón de diseño Observer / Publicar - Suscribir |
Contexto/Problema
- Diferentes tipos de Objetos suscriptotres están interesados en el cambio de estado o eventos de un Objeto publicador, y quieren reaccionar cada uno a su manera cuando el publicador genere un evento
- También nos interesa que el emisor mantenga bajo acoplamiento con los suscriptores
- Este patrón permite a los Objetos captar dinámicamente las dependencias entre Objetos, de tal forma que un objeto notificará a los Objetos dependientes de él cuando cambie su estado, siendo actualizados automáticamente
Solución
- Tenemos que crear una Interfaz suscriptora u oyente (listener)
- Las Clases suscriptoras tienen que implementar la mencionada Interfaz
- Por otro lado tenemos que crear una Clase Publicadora que contenga un método encargado de registrar suscriptores que estén interesados en ser avisados cuando sucede un evento
Ejemplo - Detector de humo en una aula de una escuela
Imaginemos que estamos en una aula de una escuela y que en esta aula hay un aparato que detecta humo.
Si se produce un incendio en dicha aula, el detector de humo avisará de que hay humo en el aula a una serie de personas. Entre estas personas se encuentran:
- el formador que imparte un curso
- y también es responsable de desalojar a todos los alumnos del aula en caso de incendio
- el recepcionista de la escuela
que informa de los diferentes cursos que la escuela imparte
- y también es responsable de localizar al director de la escuela en caso de incendio
- el conserje del edificio
que reparte la correspondencia
- y también es responsable de activar la alarma general de todo el edificio en caso de incendio
Si este planteamiento lo trasladamos al mundo de la Orientación a Objetos podemos decir que los Objetos de tipo Formador, Recepcionista y Conserje quieren ser avisados cuando hay humo en la citada aula.
- para que las instancias de estas Clases puedan ser avisadas, antes se tendrán que suscribir al aparato detector de humo, para que puedan reaccionar cada uno a su manera ante tal evento
- el Objeto de tipo Formador desalojará a todos los alumnos del aula
- el Objeto de tipo Recepcionista localizará al director de la escuela
- el Objeto de tipo Conserje activará la alarma general de todo el edificio
El detector de humo lo representaremos por un Objeto de tipo DetectorHumo que tendrá que publicar a sus suscriptores que ha detectado humo en el aula.
Este es el Diagrama de Clases de diseño que nos muestra esta situación
- HumoEvent
- el Objeto de tipo HumoEvent será enviado a cada uno de los suscriptores cuando el Objeto de tipo DetectorHumo detecte que hay un porcentaje de humo elevado en el aula.
- la relación de Asociación que hay entre DetectorHumo y HumoEvent indica que HumoEvent es una variable de instancia de DetectorHumo.
- DetectorHumo
- es un aparato que avisa si hay un porcentaje de humo demasiado elevado
- decimos que la variable de instancia detectorHumoListener es de tipo Collection sin indicar concretamente si es una Matriz, Vector, ArrayList o cualquier otra estructura de datos porque así de esta forma este Diagrama de Clases de Diseño UML queda abierto para cualquier lenguaje Orientado a Objetos a parte del lenguaje Java
- addDetectorHumoListener(dhl:DetectorHumoListener):void
- este método es invocado por las Clases suscriptoras para registrarse al detector de humo.
- este método va añadiendo a su colección los suscriptores a medida que se van registrando
- publishDetectorHumoEvent(he:HumoEvent):void
- este método recorrerá la colección de suscriptores e invocará, es decir publicará, a los métodos accionHumo(...) de todos los suscriptores para que cada uno actúe según sus responsabilidades
- el asterisco en la relación de Asociación que hay entre DetectorHumo y la Interfaz DetectorHumoListener nos indica que DetectorHumo puede tener cero o más suscriptores
- DetectorHumoListener
- todos los Objetos Suscriptores tienen que implementar este Interfaz para así de esta forma estar obligados a implementar el método accionHumo(he:HumoEvent):void
- Formador
- además de relizar su labor habitual de impartir un curso también realizará la acción de desalojar a todos los alumnos del aula