Descargar

Diseño de Software – Observer, State y Visitor (página 2)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red 11 Observer Implementación Al registrar un observer es posible asociarle el evento sobre el que quiere ser notificado.

attach(Observer obs, Evento interes);

Cuando las relaciones de dependencia entre subjects y observers son complicadas encapsular la semántica de actualización en una clase ManejadorCambio (Mediador). En Smalltalk, las interfaces de las clases Subject y Observer se definen en la clase Object.

edu.red 12 Observer en Java public class Observable { private boolean changed = false; private Vector obs; public Observable() { obs = new Vector(); } public synchronized void addObserver (Observer o) {..} public synchronized void deleteObserver (Observer o) {..} public void notifyObservers (Object arg) {..} protected synchronized void setChanged() {..} protected synchronized void clearChanged() {..} public synchronized boolean hasChanged() {.. }

edu.red 13 Observer en Java

public interface Observer { void update (Observable o, Object arg); } Argumento pasado al método notifyObservers, puede indicar el tipo de cambio

edu.red 14 Observer en Java Problema Que la clase que deseamos que actúe como Observable ya herede de otra clase: ¡En Java no hay herencia múltiple! Usar delegación Una clase ConcreteSubject contendrá a un objeto de una clase que heredará de Observable, y tendrá implementaciones “wrapper” de addObserver y deleteObserver. Se delega el comportamiento que necesita ConcreteSubject al objeto Observable que contiene. ¿Por qué una subclase de Observable?

edu.red 15 Modelo de Eventos de Java 1.1 Java 1.1 introdujo un nuevo modelo de eventos basado en el patrón Observer. Objetos que pueden generar eventos son llamados fuentes de eventos (event sources). Objetos que desean ser notificados de eventos son llamados oyentes de eventos (event listeners). Una fuente juega el papel de ConcreteSubject y un listener juega el papel de ConcreteObserver. Los listeners deben registrarse en las fuentes. Un listener debe implementar una interfaz que proporciona los métodos que deben ser llamados por la fuente para notificar un evento.

edu.red

edu.red 17 Modelo de Eventos de Java 1.1 Es un modelo no orientado a eventos de componentes GUI. Hay 11 interfaces listener cada una apropiada para un diferente tipo de evento GUI: ActionListener, ItemListener, KeyListener, MouseListener, WindowListener, … En algunos casos la interfaz listener incluye más de un método: Java proporciona adaptadores

edu.red 18 Modelo de Eventos de Java 1.1 public class CounterView extends Frame { private TextField tf = new TextField(10); private Counter counter; // referencia al modelo public CounterView(String title, Counter c) { super(title); counter = c; Panel tfPanel = new Panel(); … Button incButton = new Button("Increment"); incButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { counter.incCount(); tf.setText(counter.getCount() + ""); } } ); buttonPanel.add(incButton); …

edu.red 19 Modelo de Eventos de Java 1.1 Si creamos dos instancias de CounterView para el mismo objeto contador, ¿Qué debemos hacer para que un cambio en el valor de contador en una de ellas afecte a la otra?

public class ObservableCounter extends Observable { private int count; public ObservableCounter(int count) { this.count = count; } public int getCount() { return count; } public void incCount() { count++; setChanged(); notifyObservers(); } … }

edu.red 20 Modelo de Eventos de Java 1.1 public class ObservableCounterView extends Frame { private ObservableCounter counter; private TextField tf = new TextField(10); public ObservableCounterView(String title, ObservableCounter c) { super(title); counter = c; counter.addObserver(new Observer() { public void update(Observable src, Object obj) { if (src == counter) { tf.setText(((ObservableCounter)src).getCount() + "");} } } ); …

edu.red 21 State (Estado) Propósito Permite a un objeto cambiar su comportamiento cuando cambia su estado. El objeto parece cambiar de clase. Motivación Una conexión TCP puede encontrarse en uno de varios estados, y dependiendo del estado responderá de un modo diferente a los mensajes de otros objetos para solicitudes tales como abrir, cerrar o establecer conexión.

edu.red 22 Estado Motivación

edu.red 23 Estado Estructura

edu.red 24 Estado Aplicabilidad El comportamiento del objeto depende de su estado, y debe cambiar su comportamiento en tiempo de ejecución dependiendo de su estado. Las operaciones tienen grandes estructuras CASE que dependen del estado del objeto, que es representado por uno o más constantes de tipo enumerado.

edu.red 25 Estado Consecuencias Coloca todo el comportamiento asociado a un particular estado en una clase. Subclases vs. Sentencias CASE. Ayuda a evitar estados inconsistentes Transiciones de estado son más explícitas. Incrementa el número de objetos Los objetos estado pueden ser Singleton.

edu.red 26 Estado Implementación ¿Quién define las transiciones entre estados? Contexto o subclases estado. Una alternativa es definir tablas que representan la matriz de transiciones de estado: no es posible asociar acciones a los cambios de estado y más difícil de comprender. ¿Cuándo son creados los objetos estado? Pueden crearse cuando se necesiten o con antelación y que Contexto tenga una referencia a ellos.

edu.red 27 Strategy/Policy (Estrategia) Propósito Define una familia de algoritmos, encapsula cada uno, y permite intercambiarlos. Permite variar los algoritmos de forma independiente a los clientes que los usan Motivación Existen muchos algoritmos para justificación de texto, ¿debe implementarlo el cliente que lo necesita?

edu.red 28 Estrategia Motivación

edu.red 29 Estrategia Estructura

edu.red 30 Estrategia Aplicabilidad Configurar una clase con uno de varios comportamientos posibles. Se necesitan diferentes variantes de un algoritmo. Una clase define muchos comportamientos que aparecen como sentencias CASE en sus métodos.

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPágina siguiente