Patrón Observer¶
Problema a resolver¶
Problema
Cómo notificar cambios en una clase C a un conjunto no acotado y variable de clases heterogéneas donde, además, el número de instancias de dichas clases a ser notificadas puede variar en tiempo de ejecución.
Ventajas e Incovenientes¶
Receta para aplicar el patrón¶
- Identificar la clase
Ccuyas modificaciones necesitan ser notificadas.- Crear una clase abstracta
C_Observer.- Añadir un método
void x_Changed(<params>)a la clase abstractaC_Observerpor cada cambioxenCque necesite ser notificado. Añadir como parámetros a ese métodos los que se estime conveniente para que los observadores puedan actualizar su estado tras ser notificados.- Añadir a la clase
Cun conjuntoobserversdeC_Observers. Permitir además que se puedan añadir y eliminar objetos a esta colección en tiempo de ejecución.- Añadir a la clase
Cun método no públiconotify_x()por cada tipo de cambioxque pueda producirse en la claseC. Dicho método recorrerá la colecciónobserverse invocará por cada elementoobsde dicha colección su métodox_changed(..), proporcionando los parámetros adecuados.- Hacer que siempre que
Csufra un cambioxse invoque el métodonotify_x().- Hacer que cada clase que necesite actualizarse cuando
Ccambie implemente la clase abstractaC_Observer.- Hacer que, cuando un objeto
objnecesite actualizarse cuando un objeto concretounCde la claseCcambie, el objetoobjse registre como observador en dicho objetounC.- Hacer que cuando un objeto
objdeje de necesitar actualizarse cuando un objeto concretounCde la claseCcambie, el objetoobjse retire del registro de observadores de dicho objetounC.
Detalles a considerar¶
- ¿Cuántos parámetros deben tener los métodos de la clase Observer?
- ¿Son realmente necesarios los métodos notify?
- ¿Debo suscribirme a todos los cambios o sólo a algunos concretos?
- ¿Necesito métodos de registro y baja como observador explícitos?