Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose...

27

Transcript of Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose...

Page 1: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.
Page 2: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Patrón Observador

Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general en un contexto particular.

Page 3: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Clasificación• Propósito: Lo que realiza

• Comportamiento: Describe las formas en que las clases u objetos interactúan o distribuyen responsabilidades.

• Alcance: Donde se aplica principalmente.• Objetos: Describen como un grupo de

objetos cooperan para realizar una actividad que un objeto no puede realizar por si solo.

Page 4: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Intención

• Que hace:

• Definir una dependencia 1:n de manera que cuando el objeto 1 cambie su estado, los n objetos sean notificados y se actualicen automáticamente

Page 5: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Conocido también como

• Patrón Publicar/Suscribir

• Patrón Fisgón

• Patrón Observer

• Patrón Dependents

Page 6: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Contexto

• Mantener los objetos de presentación o componentes de GUI separados de los objetos de almacenamiento de datos del sistema.

• En muchas GUI’s se separan dos aspectos: los datos y la representación de esos datos

• De esta forma las clases que definen los datos y las presentaciones de las mismas pueden ser reutilizadas independientemente.

• Cuando un usuario cambia la información de los datos, todas las representaciones de esos datos deben ser actualizadas.

Page 7: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Motivación

● La representaciones de los datos son dependientes de los datos en si.

● No hay ninguna razón para delimitar el número de objetos dependientes.

● El patrón observer describe como establecer esta relación.

Page 8: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Aplicabilidad

Este patrón debe aplicarse cuando:

• Cambios en algunos de los objetos del sistema requieren cambios en otros objetos del mismo grupo.

• El número de oyentes puede variar durante el ciclo de vida del objeto.

• El bajo acoplamiento es un requerimiento básico del diseño.

Page 9: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Estructura

Sujeto

suscribir(Observador)eliminar(Observador)notificar()

SujetoConcreto

estadoSujeto

setEstado()

getEstado()

Para todo o en observadores{ o.actualizar();}

ObservadorConcreto

estadoObservador

actualizar() estadoObservador = sujeto.getEstado();

Observador

actualizar()

return estadoSujeto;

observadores

sujeto

Page 10: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Participantes

• Sujeto:

• Conoce sus observadores

• Tiene n observadores

• Provee una interfaz para agregar o eliminar observadores

• Observador

• Provee una interfaz actualizada para recibir señales del sujeto

Page 11: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Participantes

• Sujeto concreto

• Almacena el estado del sujeto por el cual el observador esta interesado

• Envía una notificación a su observador

• Observador concreto

• Mantiene una referencia a un objeto Sujeto Concreto

• Mantiene el estadoObservador

• Implementa la operación actualizar

Page 12: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Colaboraciones

setEstado()

notificar()

actualizar()

getEstado()

actualizar()

getEstado()

unSujetoConcreto unObservadorConcreto otroObservadorConcreto

Observador A Observador B

sujeto

actualizar() actualizar()getEstado()

setEstado()

Page 13: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Consecuencias

Ventajas• Permite reutilizar sujetos y

observadores por separado asi como añadir nuevos observadores sin modificar el sujeto o los otros observadores.

• El acoplamiento abstracto entre el sujeto y el observador ayuda a la division en niveles del sistema.

Page 14: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

ConsecuenciasDesventajas•Todos los oyentes reciben todos los eventos lanzados, sin distinción. Esto es ineficiente, y los observadores deberían ser capaces de registrarse sólo para aquellos eventos en los que estén interesados.

•A menudo los sistemas tienen varios componentes que son generadores de eventos, y varios componentes que escuchan por esos eventos. Las relaciones entre todos estos componentes pueden ser difíciles de manejar.

Page 15: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Implementación

•El sujeto puede pasarse a si mismo como parametro en la notificacion de los cambios.

•Hay dos opciones según quien dispare la actualizacion

• Que las operaciones de cambio de estado del sujeto llamen automaticamente a notificar.

• que sean los observadores los que llamen a notificar. las actualizaciones son mas eficientes, pero puede que algun observador se olvide de hacerlo.

• cuando el sujeto es destruido los observadores deben ser destruidos o notificados de su destruccion.

• hay que asegurarse que el estado del sujeto es coherente antes de notificar a los observadores.

Page 16: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Ejemplo

Insertanotifica

sujeto* *

observadorARRAY[ ]

actualiza*

Page 17: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Implementación: Java

•Java provee una clase llamada Observable y una interfaz llamada Observer para poder establecer este tipo de dependencia.

•La dependencia Sujeto-Observador puede ser implementada sin necesidad de usar Observer y Observable, pero el resultado será el mismo.

•El Sujeto a ser observado debe extender de la clase Observable, y el Observador debe implementar la interfaz Observer.

Page 18: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Diagrama de clases

Page 19: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Implementación: Java

•Observer• public void update(Observabel obs, Object obj) Es invocado

cuando se produce un cambio en el estado del objeto Observable.

•Observable• public void addObservers( Observer obs ) Añade un

observador a la lista interna de observadores.

• public void deleteObservers( Observer obs ) Borra un observador de la lista interna de observadores .

• public void deleteObservers() Borra todos los observadores de la lista interna.

– public int countObserver() Devuelve el número de observadores en la lista interna.

– protected void setChanged() Levanta el flag interno que indica que el Observable ha cambiado de estado.

Page 20: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Implementación: Java

•Observable• protected void clearChanged() Baja el flag interno que

indica que el Observable ha cambiado de estado.

• protected boolean hasChanged() Devuelve un valor booleano indicando si el Observable ha cambiado de estado.

• public void notifyObservers() Comprueba el flag interno para ver si el Observable ha cambiado de estado y lo notifica a todos los observadores.

• public void notifyObservers( Object obj ) Comprueba el flag interno para ver si el Observable ha cambiado de estado y lo notifica a todos los observadores. Les pasa el objeto especificado en la llamada para que lo usen los observadores en su método update().

Page 21: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Implementación: Sujeto1 public class Sujeto{

2 private ArrayList misObservadores;

3 public Sujeto(){

4 misObservadores = new ArrayList();

5 }

6 public void suscribir(Observador obs){

7 misObservadores.add(obs);

8 }

9 public void eliminar(Observador obs){

10 misObservadores.remove(obs);

11 }

12 public void notificar(){

13 for(int i = 0; i < misObservadores.size(); i++){

14 Observador obs = (Observador)misObservadores.get(i);

15 obs.actualizar();

16 } }}

Page 22: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

● 1 public class Fecha extends Sujeto{

● 2 private int dia, mes, anio;

● 3 public Fecha(int elDia, int elMes, int elAnio){// constructor

● 4 dia = elDia;

● 5 mes = elMes;

● 6 anio = elAnio;

● 7 System.out.println("Creado Sujeto con datos: "+dia+" "+mes+" "+anio+"\n"); }

● 8 public void setFecha(int elDia, int elMes, int elAnio){

● 9 dia = elDia;

● 10 mes = elMes;

● 11 anio = elAnio;

● 12 System.out.println("\nModifico Sujeto con datos: "+dia+" "+mes+" "+anio);

● 13 notificar(); }

● 14 public int obtenerDia(){

● 15 return dia; }

● 16 public int obtenerMes(){

● 17 return mes; }

● 18 public int obtenerAnio(){

● 19 return anio; }}

Implementación: Sujeto concreto

Page 23: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

1 public interface Observador{

2 public void actualizar();

3 }

Implementación: Observador

Page 24: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

1 public class VisorFechaConsola implements Observador{

2 private Fecha sujeto;

3 private int visor;

4 private String nombre;

5 public VisorFechaConsola(Fecha f, int vs, String nom){

6 sujeto = f;

7 visor = vs;

8 nombre = nom;

9 sujeto.suscribir(this);

10 }

11 public void actualizar(){

12 mostrar();

13 }

14 public void setEstado(int d, int m, int a){

15 sujeto.setFecha(d,m,a);

16 }

Implementación: Observador concreto

Page 25: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

17 public void mostrar(){

18 int dia = sujeto.obtenerDia();

19 int mes = sujeto.obtenerMes();

20 int anio = sujeto.obtenerAnio();

21 String[] meses = {"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"};

22 if(visor == 1){

23 System.out.println("Observador"+nombre+":("+dia+"/"+mes+"/"+anio+")");

24 }

25 if(visor == 2){

26 System.out.println("Observador"+nombre+":D("+dia+")-M("+mes+")-A("+anio+ ")");

27 }

28 if(visor == 3){

29 System.out.println("Observador " + nombre + ": " + meses[mes-1] + " " + dia + " de " + anio);

30 } } }

Implementación: Observador concreto

Page 26: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

1 public class EjemploObservador

2 {

3 public static void main(String[] args)

4 {

5 Fecha f = new Fecha(3,10,1999);

6 VisorFechaConsola v1 = new VisorFechaConsola(f,1,"uno");

7 VisorFechaConsola v2 = new VisorFechaConsola(f,2,"dos");

8 VisorFechaConsola v3 = new VisorFechaConsola(f,3,"tres");

9 v1.mostrar();

10 v2.mostrar();

11 v3.mostrar();

12 f.setFecha(4,4,2005);

13 v2.setEstado(22,11,2005);

14 f.eliminar(v1);

15 f.setFecha(27,11,2005);

16 }}

Implementación: Ejemplo

Page 27: Patrón Observador Un patrón de diseño es una descripción de clases y objetos comunicándose entre si adaptada para resolver un problema de diseño general.

Creado Sujeto con datos: 3 10 1999

Observador uno: (3/10/1999)Observador dos: D(3) - M(10) - A(1999)Observador tres: Octubre 3 de 1999

Modifico Sujeto con datos: 4 4 2005Observador uno: (4/4/2005)Observador dos: D(4) - M(4) - A(2005)Observador tres: Abril 4 de 2005

Modifico Sujeto con datos: 22 11 2005Observador uno: (22/11/2005)Observador dos: D(22) - M(11) - A(2005)Observador tres: Noviembre 22 de 2005

Modifico Sujeto con datos: 27 11 2005Observador dos: D(27) - M(11) - A(2005)Observador tres: Noviembre 27 de 2005

Implementación: Salida