Vamos a describir en los siguientes apartados, como crear una
nueva clase Observable y una nueva clase Observer
y como utilizar las dos conjuntamente.
Una nueva clase de objetos observables se crea extendiendo la
clase Observable. Como la clase Observable ya implementa
todos los métodos necesarios para proporcionar el funcionamiento
de tipo Observador/Observable, la clase derivada solamente necesita
proporcionar algún tipo de mecanismo que lo ajuste a su
funcionamiento particular y proporcionar acceso al estado interno
del objeto Observable.
En la clase ValorObservable que mostramos a continuación,
el estado interno del Modelo es capturado en el entero n
.
A este valor se accede (y más importante todavía,
se modifica) solamente a través de sus métodos públicos.
Si el valor cambia, el objeto invoca a su propio método
setChanged() para indicar que el estado del Modelo ha cambiado.
Luego, invoca a su propio método notifyObservers()
para actualizar a todos los observadores registrados.
import java.util.Observable; public class ValorObservable extends Observable { private int nValor = 0; // Constructor al que indicamos el valor en que comenzamos y los // limites inferior y superior que no deben sobrepasarse public ValorObservable( int nValor,int nInferior,int nSuperior ) { this.nValor = nValor; } // Fija el valor que le pasamos y notifica a los observadores que // estan pendientes del cambio de estado de los objetos de esta // clase, que su etado se ha visto alterado public void setValor(int nValor) { this.nValor = nValor; setChanged(); notifyObservers(); } // Devuelve el valor actual que tiene el objeto public int getValor() { return( nValor ); } }
Una nueva clase de objetos que observe los cambios en el estado
de otro objeto se puede crear implementando la interface Observer.
Esta interface necesita un método update() que se
debe proporcionar en la nueva clase. Este método será
llamado siempre que el Observable cambie de estado, que anuncia
este cambio llamando a su método notifyObservers().
El observador entonces, debería interrogar al objeto Observable
para determinar su nuevo estado; y, en el caso de la arquitectura
MVC, ajustar su Vista adecuadamente.
En la clase ObservadorDeTexto, que muestra el código
siguiente, el método notify() primero realiza una
comprobación para asegurarse de que el Observable que ha
anunciado un cambio es el Observable que él esta observando.
Si lo es, entonces lee su estado e imprime el nuevo valor.
import java.util.Observer; import java.util.Observable; public class TextoObservador extends Frame implements Observer { private ValorObservable vo = null; public TextoObservador( ValorObservable vo ) { this.vo = vo; } public void update( Observable obs,Object obj ) { if( obs == vo ) tf.setText( String.valueOf( vo.getValor() ) ); } }
Un programa indica a un objeto Observable que hay un objeto observador
que debe ser notificado cuando se produzca un cambio en su estado,
llamando al método addObserver() del objeto Observable.
Este método añade el Observador a la lista de observadores
que el objeto Observable ha de notificar cuando su estado se altere.
En el ejemplo siguiente, en donde mostramos la clase ControlValor,
ControlValor.java, vemos como se usa el método addObserver()
para añadir una instancia de la clase TextoObservador
a la lista que mantiene la clase ValorObservable.
public class ControlValor { // Constructor de la clase que nos permite crear los objetos de // observador y observable public ControlValor() { ValorObservable vo = new ValorObservable( 100,0,500 ); TextoObservador to = new TextoObservador( vo ); vo.addObserver( to ); } public static void main( String args[] ) { ControlValor m = new ControlValor(); } }En la siguiente secuencia, vamos a describir como se realiza la interacción entre un Observador y un objeto Observable, durante la ejecución de un programa:
|
[Anterior] [Indice] [Siguiente] |