Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Patron de Diseño Observer, Diapositivas de Programación Java

Patron de Diseño Observer, propositos y ejemplos codificados

Tipo: Diapositivas

2019/2020

Subido el 05/11/2020

lazaro-michel
lazaro-michel 🇲🇽

1 documento

1 / 20

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
Técnicas de Programación - Curso 2008/09
(Esther Guerra Sánchez)
Patrones de Diseño
Patrón de comportamiento Observer
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14

Vista previa parcial del texto

¡Descarga Patron de Diseño Observer y más Diapositivas en PDF de Programación Java solo en Docsity!

Técnicas de Programación - Curso 2008/

(Esther Guerra Sánchez)

Patrones de Diseño

Patrón de comportamiento

Observer

Observer Propósito z

Define una dependencia de uno-a-muchos entreobjetos de forma que, cuando un objeto cambiade estado, se notifica a los objetos dependientespara que se actualicen automáticamente.

z

También conocido como

dependents

,^

publish-

subscribe

Observer Aplicabilidad z

Usa el patrón

Observer

z

Cuando una abstracción tiene dos aspectos, y unodepende del otro. Encapsular los aspectos en objetosdistintos permite cambiarlos y reutilizarlos.

z

Cuando cambiar un objeto implica cambiar otros, perono sabemos exactamente cuántos hay que cambiar

z

Cuando un objeto debe ser capaz de notificar algo aotros sin hacer suposiciones sobre quiénes son dichosobjetos. Esto es, cuando se quiere bajo acoplamiento.

Observer Estructura

Observer+ update()

Subject

  • attach(Observer)+ detach (Observer)+ notify ()

forall o in observers:o.update();

ConcreteSubject- subjectState+ getState()+ setState()

ConcreteObserver- observerState+ update()

return subjectState;

observers

0..

subject0..

observerState = subject.getState();

Observer Colaboraciones

:ConcreteSubject

co

:ConcreteObserver

co

:ConcreteObserver

setState()

notify()

update()getState()update()getState()

(sujeto con dos observadores)

Observer Colaboraciones

:ConcreteSubject

co

:ConcreteObserver

setState()

notify()

update()getState() (sujeto con un número arbitrario de observadores)

loop

[for each co in observers]

Observer Implementación z^

Correspondencia entre sujetos y observadores z^

Usualmente, el sujeto guarda una referencia a sus observadores z^

Costoso si hay muchos sujetos y pocos observadores. En ese caso: z^

usar tabla hash: menor coste en espacio, pero mayor coste en tiempo

z^

Observar más de un sujeto (ej. hoja de cálculo con 2 fuentes de datos) z^

Extender la interfaz de actualización para que el observador sepa quésujeto cambió de estado (por ej. pasar el sujeto en la llamada a

update

).

s1:Sujetos2:Sujetos3:Sujetos4:Sujeto

o:Observador

hashintermedia(s1, s3 y s4 no incurren en gasto de almacenamiento de observadores)

Observer Implementación z^

¿Quién dispara la actualización llamando a

notify

z^

El sujeto desde aquellos métodos que cambian su estado z^

ventaja: las clases cliente no tienen que hacer nada

z^

inconveniente: no es óptimo si hay varios cambios de estado seguidos

z^

Las clases cliente z^

ventaja: se puede optimizar llamando a
notify
tras varios cambios

z^

inconveniente: los clientes tienen la responsabilidad de llamar a
notify

z^

Referencias perdidas a sujetos que se han eliminado z^

Se puede evitar notificando la eliminación del sujeto a sus observadores z^

En general, eliminar los observadores del sujeto eliminado no es unaopción

Observer Implementación z^

Asegurarse de la consistencia del sujeto antes de una notificación z^

Soluciones: z^

documentar los métodos que envían notificaciones

z^

patrón de diseño
Template Method

class ClaseSujetoBase {

void

operacion (int valor) {_miVar += valor; } void operacionNotify (int valor) {

self.operacion(valor);

// ejecuta la operación

self.notify();

// dispara la notificación

} } class MiSujeto extends

ClaseSujetoBase {

void operacion (int

valor) {

super.operacion(valor);_miVar += valor; } }

los clientes llaman a

operacionNotify

en vez de a

operacion

Observer Implementación z^

Evitar protocolos de actualización específicos del observador z^

Modelo

pull

: el sujeto envía lo mínimo, los observadores piden lo necesario

z^

inconveniente: puede ser poco eficiente

z^

Modelo

push

: el sujeto envía información detallada del cambio, aunque los

observadores no la necesiten. z^

inconveniente: observadores menos reutilizables

z^

Especificar las modificaciones de interés explícitamente z^

Hacer

update

más eficiente, haciendo que los observadores se registren

sólo en los eventos que les interesan z^

Los observadores se subscriben a

aspectos

del sujeto

class
Subject {
public
attach
(Observer
o,
Aspect
a)
} class
Observer
public
update
(Subject s,
Aspect
a)

Observer Ejemplo

Observer+ update()

Subject

  • attach(Observer)+ detach (Observer)+ notify () Datasource
  • a, b, c, d: double+ getState(): double[4]+ setState(double[4]): void

Fila

  • data: double[4]+ update()

observers

1

1

Barras

  • a, b, c, d: double+ update()

Circular

  • a, b, c, d: double+ update()

*^

1

1

Observer Código de ejemplo

public abstract class Subject {

protected List _observers;public Subject() {

_observers =new LinkedList(); } public void attach(Observer o) {

_observers.add(o); } public void detach(Observer o) {

_observers.remove(o); } public void notify() {

Iterator it;it = _observers.iterator();while (it.hasNext())

it.next().update();

} }

public class Datasource

extends Subject {private double _a, _b, _c, _d;public double[] getState () {

double[] d = new double[4];d[0] = _a;d[1] = _b;d[2] = _c;d[3] = _d;return d; } public void setState(double[] d){

_a = d[0];_b = d[1];_c = d[2];_d = d[3];this.notify(); } }

Observer Código de ejemplo

public abstract class Observer {

public abstract void update (); }

public class Fila extends Observer {

private Datasource _subject;private double[] _data;public Fila (Datasource s) {

_subject = s;_subject.attach(this);_data = new double[4]; } public void update () {

double[4] data;data = _subject.getState();for (int i=0; i<4; i++)

_data[i] = data[i]; this.redraw(); } public void redraw () { ... } }

Observer En java… z^

La interfaz

java.util.Observer

z^

void update (Observable o, Object arg)

z^

La clase

java.util.Observable

z^

Observable() z^

void addObserver(Observer) z^

int countObservers() z^

void deleteObserver(Observer o) z^

void deleteObservers() z^

void notifyObservers() z^

void notifyObservers(Object arg) z^

boolean hasChanged() z^

void clearChanged() z^

void setChanged()