Top Banner
Patrones de Diseño con ejercicios en Java [email protected]
103

Patrones de Diseño con ejercicios en Java [email protected].

Feb 02, 2016

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Diseño

con ejercicios en Java

[email protected]

Page 2: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

¿Qué es un patrón de diseño?

Es una solución bien documentada que los expertos aplican para solucionar nuevos problemas porque han sido utilizadas con éxito en el pasado

Los expertos identifican partes de un problema que son similares a otros problemas que han encontrado anteriormente

Recuerdan la solución aplicada y la generalizan Adaptan la solución general al contexto del

problema actual

Page 3: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

¿Qué es un patrón de diseño?

Son una forma estandarizada para representar soluciones generales de problemas que se encuentran comúnmente en el desarrollo de software orientado a objetos

Beneficios Catálogos de patrones Están documentados los pros y los contras de cada patrón.

Se conocen las implicaciones de su aplicación Proporcionan un vocabulario común entre desarrolladores

Page 4: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Abstracción y Reutilización

Los patrones suponen una evolución en la abstracción y reutilización en la programación

Abstracción Resolución de problemas complejos dividiéndolos

en otros más simples Capacidad de ocultar detalles superfluos y

centrarse en lo relevante para reducir la complejidad

Page 5: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Abstracción y Reutilización

Reutilización Posibilidad de usar de nuevo código ya

desarrollado anteriormente Formas de reutilización

Copiar y Pegar !!PELIGRO¡¡ Reutilización de algoritmos (búsquedas,

ordenaciones, …) Reutilización de funciones (métodos) Reutilización de librerías o APIs (métodos, clases, …)

Page 6: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Abstracción y Reutilización

Abstracción y Reutilización en Programación Orientada a Objetos Abstracción funcional y de datos La encapsulación implica mejor reutilización La herencia permite formas de reutilización antes

no posibles Es posible desarrollar algoritmos de forma genérica y

especializarlos creando clases hijas y redefiniendo o implementando ciertos métodos

Page 7: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Abstracción y Reutilización

Tipo de Reutilización

¿Se puede aplicar de nuevo?

¿Qué se abstrae? Genericidad

Fragmento de código

Muy Pobre Nada Muy pobre

Estructura de datos Buena Tipos de datos Moderada-Buena

Funcional Buena Método Moderada-Buena

Tipos Genéricos Buena Operación para tipo Buena

Algoritmo Buena Fórmula Buena

Clases (Interfaz, Polimorfismo, Clase abstracta)

Buena Datos + Métodos Buena

API (Librería) Buena Clases útiles Buena-Muy Buena

Componente Buena Grupo de Clases Buena-Muy Buena

Patrón de Diseño Excelente Solución a un problema

Muy Buena

Page 8: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Tipos de Patrones

Existen cuatro grandes tipos de patrones de diseño Patrones de Creación Patrones de Comportamiento Patrones Estructurales Patrones de sistema

Page 9: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Tipos de Patrones

Patrones de Creación Facilitan y simplifican la creación de objetos Permiten crear objetos sin definir la clase

concreta, sólo la interfaz que debe implementar Permiten reutilizar otros objetos en vez de crear

nuevos debido a restricciones o eficiencia Patrones de Comportamiento

Guían el flujo de control del sistema (para facilitar la eficiencia y facilitar el mantenimiento)

Page 10: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Tipos de Patrones

Patrones Estructurales Describen formas efectivas de partir y combinar

los elementos de una aplicación Permiten la comunicación de sistemas

incompatibles, la introducción de simplificaciones que mejoren la independencia entre partes,…

Patrones de sistema Se aplican a la arquitectura de la aplicación Patrones más generales que los otros tipos

Page 11: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

¿Cómo es un patrón?

Los patrones están especificados siguiendo un formulario o formato estándar: Nombre También conocido como – Otros nombres usuales Propiedades

Tipo - Creación, Comportamiento, Estructural o De sistema Nivel - Clase única, Componente (Grupo de clases),

Arquitectónico (Coordina sistemas y subsistemas) Propósito - ¿Para qué sirve? Presentación – Problema que soluciona (con ejemplos) Aplicabilidad – Cuando y por qué debería usarse

Page 12: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

¿Cómo es un patrón?

… Descripción – Que hace y como se comporta de

forma detallada Implementación - ¿Cómo implementarlo? Ventajas e Inconvenientes Variantes Patrones Relacionados Ejemplo

Page 13: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Facilitan y simplifican la creación de objetos Permiten crear objetos sin definir la clase

concreta, sólo el interfaz que debe implementar

Permiten reutilizar otros objetos en vez de crear nuevos debido a restricciones o eficiencia

Page 14: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único) Restringe la creación de un único objeto de una

clase en todo el sistema y permite acceder a él Factory Method (Método Factoría)

Define un método para la creación de objetos además del constructor

Builder (Constructor) Simplifica la construcción de objetos complejos

definiendo una clase cuya responsabilidad es crear objetos de otras clases

Page 15: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Abstract Factory (Fábrica Abstracta) Permite crear objetos de un conjunto de clases

relacionadas pero sin especificar la clase concreta, solo el interfaz

Prototype (Prototipo) Define clases cuyos objetos pueden clonarse

Hay muchos mas…

Page 16: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Propiedades Tipo: Creación, Nivel: Objeto

Propósito Permite tener una única instancia de esta clase

en el sistema, y permite que todas las clases tengan acceso a esa instancia

Page 17: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Introducción Hay veces que se necesita esta funcionalidad Por ejemplo: Un histórico de todas las acciones que realiza

el usuario en la aplicación. Desde todas las clases se necesita usar el mismo objeto HistoryList

Se podría crear un único objeto y pasar ese objeto como parámetro a todos los demás objetos. Puede no saberse a priori quien va a necesitar el objeto y puede ser complejo estar pasándolo constantemente. Sólo con documentación se puede obligar a que nadie más cree un objeto HistoryList

Page 18: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Introducción… Se podría crear el objeto al inicio y colocarlo en

un atributo estático. Pero no se podría proporcionar ninguna información de inicialización justo cuando vaya a usarse y no se puede controlar quien accede al objeto

Page 19: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Aplicabilidad Cuando se requiera una instancia de una clase y accesible

globalmente Descripción

Asegura crear como máximo una instancia de un objeto. Ponga el constructor privado Ponga un método público estático getInstance() que

devuelva el objeto. Este método crea la instancia si no se ha creado todavía, la guarda como un atributo estático privado y la devuelve

Se puede crear el objeto directamente sobre el atributo estático

Page 20: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Implementación Clase que tiene privado el

constructor, mantiene una referencia estática al único objeto de la clase y proporciona un método estático getInstance() para que otras clases accedan al único objeto

El resto de la implementación es completamente normal

Page 21: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)import java.util.ArrayList;import java.util.Collections;import java.util.List;

public class HistoryList {

private static HistoryList instance = new HistoryList();

private List history = new ArrayList();

private HistoryList() { }

public static HistoryList getInstance() { return instance; }

public void addCommand(String command) { history.add(command); }

public Object undoCommand() { return history.remove(history.size() - 1); }

...}

Page 22: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Ventajas La clase Singleton es la única que puede crear objetos de

la clase, asegurando la unicidad No se necesita pasar la referencia a todos los objetos que

la necesiten, simplificando el desarrollo y haciendo la aplicación más mantenible

Inconvenientes Puede tener problemas en aplicaciones con muchos hilos

de ejecución y con una única instancia Si en el sistema evoluciona y se necesitan más instancias

de la clase, habría que cambiar todos los accesos a la clase Singleton

Page 23: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Variaciones del patrón Mantener varias instancias que pueden ser

obtenidas con versiones con parámetros del método getInstance(...)

Cuando existen múltiples instancias, pueden ser de clases hijas diferentes dependiendo de los parámetros

Page 24: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Patrones relacionados Abstract Factory (Factoría Abstracta) Builder (Constructor) Prototype (Prototipo)

Page 25: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Singleton (Único)

Patrón Singleton en la API de Java Clase java.awt.Toolkit

Variación del patrón porque Toolkit es abstracta y la instancia devuelta es de una clase hija

El método es getDefaultToolkit() Clase java.lang.Runtime

El método es getRuntime() Clase java.text.DateFormat

Variación del patrón porque DateFormat es abstracta Tiene varios métodos con varias instancias getDateInstance(), getDateInstance(int style), getDateTimeInstance(), …

Page 26: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 1

Aplica el patrón Singleton a la clase GestorIO en el juego de las Tres en Raya

De esta forma se conseguirá eficiencia, porque con un objeto GestorIO es suficiente en toda la aplicación

Page 27: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Prototype (Prototipo)

Propiedades Tipo: De creación, Nivel: Clase única

Propósito Facilita la creación de objetos copia de otros

objetos

Page 28: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Prototype (Prototipo)

Introducción En muchas ocasiones es necesario crear objetos

que tengan el mismo estado que otros objetos ya creados

Se podría crear un objeto en su estado inicial y copiar el valor de cada atributo. Pero eso obligaría a desencapsular la clase

El patrón consiste en crear un método copy que cree un objeto con el mismo estado que el que recibe el mensaje de copy

Page 29: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Prototype (Prototipo)

Aplicabilidad Se utiliza el patrón Prototype para crear un objeto

que sea copia de otro Descripción

Permite copiar el estado de un objeto Se puede utilizar en las opciones de “copiar” y

“pegar”

Page 30: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Prototype (Prototipo)

Implementación Incluir un método de copia (copy) Este método devuelve un objeto de la misma

clase cuyos atributos tienen los mismos valores que los atributos del objeto original

Ventajas e Inconvenientes Crea copias sin necesidad de que el que necesita

la copia conozca todos los atributos de lo copiado Hay que tener en cuenta la profundidad de la

copia (copiar la referencia de un atributo o copiar el atributo en sí)

Page 31: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Prototype (Prototipo)

Variaciones del patrón Constructor de copia, que recibe como parámetro

un objeto de la misma clase y obtiene de él sus valores

Patrones relacionados Abstract Factory (Factoría Abstracta) Factory Method (Método de Fabricación)

Page 32: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Prototype (Prototipo)

Ejemplo

Page 33: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 2

Aplica el patrón Prototype en la clase Lista del ejemplo de las estructuras de datos para copiar la lista

Que se copie la lista, pero no los elementos que contiene

Crea un programa ejemplo para comprobar el correcto funcionamiento del código

Page 34: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

También conocido como Virtual Builder (Constructor Virtual)

Propiedades Tipo: De creación, Nivel: Clase

Propósito Permite definir un método estándar en una clase

para crear objetos. Las subclases deciden la clase concreta que crear

Page 35: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Introducción Supongamos una aplicación de gestión de una

lista, que permita borrar, editar y añadir valores

Esta aplicación tiene dos partes, la interfaz de usuario (un menú en modo texto) y la Lista.

La lista tiene un método para poner un valor (String) en una determinada posición (int) public void set(int position, String value)

Page 36: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

… Se quiere generalizar la aplicación incorporando

una estructura de datos tipo mapa (clave,valor) Creamos la clase abstracta EstructuraDatos

(de la que heredan Lista y Mapa). Creamos la clase abstracta Selector (de la que heredan SLista y SMapa)

El menú usa objetos de EstructuraDatos y Selector.

De esta forma se pueden incorporar nuevas estructuras de datos

Page 37: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

… El problema está en que el menú tiene que

construir objetos de la clase Selector cuando le pregunta al usuario, pero no sabe que clase instanciar, si SLista o SMapa.

El patrón Método Factoría propone que exista un método en EstructuraDatos que permita crear el objeto Selector correspondiente

(Ver ejemplo)

Page 38: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Ejemplo (ver código)

Page 39: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Aplicabilidad Cuando se quiera crear un framework extensible. Cuando una subclase decide que objeto crear Sabe cuando crear un objeto, pero su clase

depende de la clase de otro objeto

Page 40: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Descripción Existe un método de fabricación en una clase

abstracta (Creator) que debe ser implementado por las clases hijas (ConcreteCreator).

Ese método devuelve objetos que heredan de una clase abstracta (Product)

Son las ConcreteCreator las que deciden la clase que hereda de Product (CocreteProduct) que deben instanciar

Page 41: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Implementación

Page 42: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Ventajas e Inconvenientes Con el polimorfismo podemos hacer código

genérico para una clase. Con este patrón podemos hacer código genérico para varias clases y el código genérico puede instanciar objetos cuando quiere

El inconveniente es que para añadir un producto nuevo hay que cambiar varias clases

Page 43: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Creación

Factory Method (Método Factoría)

Variaciones del Patrón Creator puede tener factoryMethod concreto

y proporcionar una implementación por defecto El método de fabricación puede tomar

parámetros y puede instanciar los ConcreteProduct dependiendo del parámetro

Creator y Product pueden ser interfaces Patrones relacionados

Abstract Factory (Fábrica Abstracta) Prototype (Prototipo) Template Method (Método Plantilla)

Page 44: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 3

Incorpora una nueva implementación del Tablero del juego de las Tres en Raya.

Las columnas deben identificarse mediante letras (A,B,C…)

Habrá que crear otra implementación de Coordenada con las columnas como letras

Usar el patrón Factory Method al instanciar objetos de alguna clase concreta de coordenada

Page 45: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Están relacionados con el flujo de control del sistema

Ciertas formas de organizar el control en un sistema pueden derivar en grandes beneficios para la eficiencia y el mantenimiento del sistema

Page 46: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Chain of Responsability (Cadena de Responsabilidad) Establece una cadena en un sistema, para que un

mensaje pueda ser manejado en el nivel en el que se recibe en primer lugar o ser redirigido a otro objeto que pueda manejarlo

Command (Comando) Encapsula un comando en un objeto de tal forma que

pueda ser almacenado, pasado a métodos y devuelto igual que otro objeto

Interpreter (Intérprete) Define un intérprete para un lenguaje

Page 47: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador) Proporciona una forma coherente de acceder

secuencialmente a los elementos de una colección, independientemente del tipo de colección

Mediator (Mediador) Simplifica la comunicación entre los objetos de un

sistema introduciendo un único objeto que gestiona la distribución de mensajes entre los otros

Page 48: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) Proporciona a los componentes una forma flexible de

enviar mensajes de difusión a los receptores interesados

State (Estado) Permite modificar fácilmente el comportamiento de un

objeto en tiempo de ejecución

Strategy (Estrategia) Define un grupo de clases que representa un conjunto de

posibles comportamientos. Estos comportamientos pueden ser fácilmente intercambiados.

Page 49: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Visitor (Visitante) Proporciona una forma fácil y sostenible de

ejecutar acciones en una familia de clases. Este patrón centraliza los comportamientos y permite que sean modificados o ampliados sin cambiar las clases sobre las que actúan

Page 50: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Propiedades Tipo: De comportamiento Nivel: Objeto

Propósito Encapsular un comando en un objeto de tal forma

que pueda ser almacenado, pasado a métodos y devuelto igual que cualquier otro objeto

Page 51: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Introducción Cuando un usuario selecciona una acción para ejecutarla,

la aplicación necesita saber desde dónde obtener los datos y el comportamiento relevantes

Normalmente, la aplicación mantendrá la lógica en un lugar centralizado

Los usuarios pueden necesitar deshacer las acciones realizadas

Es lógico combinar la acción en un objeto: el objeto comando. Ese objeto tiene el comportamiento y los datos necesario para una acción específica

Page 52: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Aplicabilidad Dar soporte para deshacer comandos, procesos

de identificación, etc... Poner en cola y ejecutar comandos en momentos

distintos Desacoplar la fuente de una petición del objeto

que la cumple

Page 53: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Descripción Una aplicación que no use el patrón Command

tendrá que proporcionar una clase manejadora de código para controlar todos los eventos que puedan ocurrir

El patrón Command encapsula los datos y funcionalidad necesarias para cumplir una acción o una petición específicas

Proporciona una separación entre cuándo hay que ejecutar una acción y cómo tiene que ser ejecutada

Page 54: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Implementación

Page 55: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

... Command: Interfaz de todos los comandos Invoker: El que decide cuando ejecutar el

comando Receiver: El objeto sobre el que se ejecutará el

comando ConcreteCommand: Implementación de Command. Mantiene una referencia al Receiver para realizar las acciones cuando se le llama a execute

Page 56: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Ventajas Desacopla la fuente o el disparador del evento

del objeto que tiene conocimiento para ejecutar la tarea

Permite reemplazar los objetos command y receiver en tiempo de ejecución

Al ser los comando objetos normales, es más sencillo hacer log, deshacer, ...

Facilita la introducción de nuevos comandos, tan sólo creando una nueva implementación de command

Page 57: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Variaciones Deshacer: El patrón command puede ser

extendido para incorporar la posibilidad de deshacer. Al realizar la acción se guarda lo necesario para deshacer la acción y se incorpora un método undo()

MacroCommand: Se puede crear un comando que esté compuesto por otros comandos y que pueda ser gestionado de manera uniforme (usando el patrón Composite)

Page 58: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Patrones relacionados Composite (Compuesto): Para implementar el

patrón compuesto Memento (Recuerdo): Guarda el estado del

receptor, para crear el deshacer Prototype (Prototipo): Puede ser usado para

copiar el comando antes de incluirlo en el historial Singletón (Único): En la mayoría de las

aplicaciones, el historial se implementa como un singleton

Page 59: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Command (Comando)

Ejemplo (ver código) En la aplicación de citas se incorpora un

comando con opciones de deshacer

Page 60: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 4

Incorpora el patrón Command en el programa de gestión de estructuras de datos en el que se permita la acción de deshacer

Page 61: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador) También conocido como

Cursor Propiedades del patrón

Tipo: De comportamiento Nivel: Componente

Propósito Proporcionar una forma coherente de acceder

secuencialmente a los elementos de una colección, independientemente del tipo de colección subyacente

Page 62: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador)

Introducción Las estructuras de datos pueden estar

implementadas de muchas formas Pueden usarse arrays, listas enlazadas o árboles

(por si los elementos están ordenados) Lo habitual es recorrer secuencialmente los

elementos de la colección

Page 63: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador) ...

Usar un índice que se va incrementando podría ser muy ineficiente para implementaciones basadas en árboles o listas enlazadas

El patrón Iterator resuelve este problema definiendo una interfaz uniforme y eficiente para recorrer cualquier estructura de datos de forma secuencial, independientemente de su implementación

for(int i=0; i<lista.size(); i++){ System.out.println(“Elemento:“+lista.get(i));}

Page 64: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador)

Aplicabilidad Proporcionar una forma uniforme, coherente e

independiente de la implementación, con el fin de desplazarse por los elementos de una colección

Permitir el recorrido de múltiples colecciones, permitiendo que distintos clientes naveguen simultáneamente por la misma colección

Page 65: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador) Descripción

El interfaz Iterator tiene las siguientes operaciones básicas Navegación: Desplazarse hacia delante (y quizás

hacia atrás) Recuperación: Obtener el elemento en la posición

actual Control de fin de colección: Determinar si hay un

elemento siguiente Algunas versiones extendidas permiten eliminar

el elemento referenciado

Page 66: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador)

Implementación

for(Iterator it = lista.iterator(); it.hasNext();){Objeto o = it.next();System.out.println(“Objeto: “+o);

}

Page 67: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador) Ventajas

Se simplifica el acceso secuencial a los elementos de cualquier estructura de datos

Java 1.5 incorpora un for mejorado para iterar por los elementos de cualquier colección que implemente Iterable

Inconvenientes En estructuras de datos no ordenadas (conjunto, mapa) el

orden de los elementos al recorrerlos puede ser diferente en diferentes recorridos, lo cual puede generar problemas si no se tiene en cuenta

for(Object objeto: lista){ System.out.println(“Objeto: “+objeto);}

Page 68: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador)

Ejemplo (Ver código)

Page 69: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador)

Variaciones del Patrón Existen iteradores que crean una copia de la

estructura de datos al ser creados, por si se modifica durante el recorrido

Pueden existir diferentes formas de recorrer estructuras complejas (árboles, grafos) por tanto, se podrían implementar diferentes iteradores

Page 70: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Iterator (Iterador)

Patrones relacionados Factory Method (Método Factoría): el método

iterator() es un método factoría Visitor (Visitador)

Page 71: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 5

Implementa los iteradores correspondientes en el ejercicio del Dispensador de Fracciones

Page 72: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

También conocido como Publisher-Subscriptor (Editor-Suscriptor)

Propiedades del patrón Tipo: De comportamiento Nivel: Componente

Propósito Proporcionar a los componentes una forma

flexible de enviar mensajes de difusión a los receptores interesados

Page 73: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) Introducción

En muchas ocasiones ciertas partes de un sistema deben conocer un cambio en otras partes

La solución típica es hacer que la parte que cambia invoque un método de la parte interesada

Pero hay veces que la parte que cambia se desarrolla de forma independiente a la parte interesada La parte que cambia es una librería y la parte interesada

está en nuestro programa La parte que cambia es genérica y la parte interesada no

se puede determinar (un campo de texto en un interfaz de usuario)

Page 74: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

... Lo ideal es permitir que los interesados indiquen

a la parte que cambia que están interesados en los cambios

Las partes interesadas deben implementar un interfaz, que posee uno o varios métodos que serán invocados cuando algo cambie

La parte que cambia guarda a los interesados en una lista y cuando algún cambio sucede, les invoca un método del interfaz

Page 75: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) Aplicabilidad

Al menos un emisor de mensajes (una parte que cambia y que notifica el cambio a los demás)

Uno o más receptores de mensajes El emisor no conoce como los receptores actúan ante el

cambio, simplemente lo notifica Los receptores pueden no conocerse cuando se desarrolla

el emisor Suelen ser muy usados en interfaces gráficas porque los

componentes son observados por la lógica de la aplicación para actuar en consecuencia

Page 76: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) Descripción

Considera una factura con líneas de detalle El total de la factura depende del total de cada

línea, que a su vez, depende de la cantidad y del precio por unidad

Otro tipo de información puede depender del total de la factura

El patrón observer es apropiado porque permite crear la factura completamente y posteriormente en el desarrollo, actuar ante cambios

Page 77: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) ...

Los productores de mensajes (componentes observables) generan eventos. Uno o más receptores de mensajes (los observadores) reciben esos eventos y actúan en consecuencia.

La responsabilidad del componente observable es transmitir los eventos a los observadores interesados (aquellos registrados)

Una interfaz oyente permite a los componentes observables indicar los eventos que han ocurrido y posiblemente proporcionar detalles a los observadores

Page 78: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

Implementación

Page 79: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) ...

Observable La clase cuyos objetos son susceptibles de ser

observados Proporciona métodos para registrar un observador o

eliminarlo Tiene una lista con todos los observadores

registrados Tiene un método protegido que es invocado dentro de

la clase cuando haya que notificar un cambio a los observadores

Page 80: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador) ...

Observer Interfaz que usan los Observable para comunicarse

con los interesados ConcreteObserver

Implementa la interfaz Observer y determina en la implementación de los métodos como responder a los mensajes recibidos de Observable

Event Mantiene información sobre el evento o cambio

producido que puede ser útil para el Observer

Page 81: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

Ventajas e Inconvenientes El objeto observable puede ser relativamente

simple porque las acciones que se desencadenan ante un cambio no están en la propia clase

Facilita la realización de pruebas porque se puede codificar un observador de log

Facilita el desarrollo incremental porque se pueden añadir observadores conforme los vayas codificando

Page 82: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

Ventajas e Inconvenientes... El principal problema del patrón es como hacer

los eventos que se envían Eventos genéricos

Son más fáciles de codificar pero puede ser difícil para un observador saber lo que ha pasado

Diferentes Eventos concretos Los observadores saben con detalle el cambio Se complica la codificación de los eventos porque hay

que considerar muchas situaciones

Page 83: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

Variaciones del patrón En algunas ocasiones puede soportar

únicamente un único observador Componentes observables multihilo, cada

notificación se hace en el hilo del observer Envío de la referencia al observable en el propio

evento para que los observers puedan invocar métodos en el observable con el fin de descubrir más información sobre el cambio

Page 84: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

Patrones relacionados Proxy RemoteProxy

Page 85: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones de Comportamiento

Observer (Observador)

Ejemplo (ver código)

Page 86: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 6

Independiza la gestión del socket del control del protocolo de comunicación en la aplicación de chat

Utiliza el patrón observer para notificar la llegada de un mensaje a las partes del programa interesadas

Page 87: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Describen formas efectivas de particionar y combinar los elementos de una aplicación

El patrón Adapter permite que dos sistemas se comuniquen

El patrón Facade permite presentar una interfaz simplificada a un usuario sin eliminar todas las opciones disponibles en el sistema

Page 88: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Adapter (Adaptador) Sirve como un intermediario entre dos clases,

convirtiendo las interfaces de una clase para que pueda ser utilizada por otra

Bridge (Puente) Divide un componente complejo en dos

jerarquías relacionadas –la abstracción funcional y la implementación interna-. Esto hace que sea más fácil cambiar cualquier aspecto del componente

Page 89: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto) Desarrolla una forma flexible de crear jerarquías

en estructura de árbol de una complejidad arbitraria, permitiendo a la vez que todos los elementos de la estructura funcionen con una interfaz uniforme

Decorator (Decorador) Proporciona una forma flexible de introducir o

eliminar funcionalidad a un componente sin modificar su apariencia externa o su función

Page 90: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Facade (Fachada) Proporciona una interfaz simplificada para un grupo de

subsistemas o un sistema complejo

Flyweight (Peso ligero) Reduce el número de objetos detallados de muy bajo nivel

en un sistema mediante la compartición de objetos

Proxy (Representante) Proporciona un representante de otro objeto, por distintas

razones como pueden ser el acceso, la velocidad o la seguridad

Page 91: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Propiedades del Patrón Tipo: Estructural Nivel: Componente

Propósito Desarrollar una forma flexible de crear jerarquías

en estructura de árbol de una complejidad arbitraria, permitiendo a la vez que todos los elementos de la estructura funcionen con una interfaz uniforme

Page 92: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Introducción Se desea gestionar un sistema de ficheros Existen directorios que tienen ficheros y otros

subdirectorios, que pueden tener ficheros Sin límite de profundidad Hay operaciones que se quieren realizar sobre un

directorio o sobre un fichero (tamaño en disco, permisos…)

Page 93: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Introducción... Para realizar una acción que tenga en cuenta un

subárbol completo, se puede realizar un iterador que recorra el árbol en un orden determinado y vaya realizando los cálculos

El patrón composite propone utilizar el polimorfismo y la recursividad para realizar cálculos sobre un subárbol

Page 94: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Introducción...

Page 95: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Introducción... FileSystemElem: Clase padre de Fichero y

Directorio File: Devuelve el tamaño del fichero Directory: Devuelve la suma de los

FileSystemElem y añade el tamaño de almacenar un directorio en disco (p.e 1kbyte)

Page 96: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Ejemplo (ver código)

Page 97: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Aplicabilidad Cuando exista un componente en estructura

rama-hoja, parte-todo, contenedor-contenido La estructura pueda tener cualquier nivel de

profundidad Se desea realizar operaciones con todos los

elementos del árbol (o subárbol)

Page 98: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Descripción Component

Clase o interface padre de todos los elementos del árbol. Especifica las operaciones

Composite Clase que representa a las ramas. Tienen una

colección de Component Node

Clase hoja, contiene el comportamiento final. No pueden contener otros componentes

Page 99: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Implementación

Page 100: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Ventajas e Inconvenientes Proporciona gran flexibilidad en la estructura y

una interfaz muy manejable Sin importar la posición actual en la estructura, se

puede llamar a cualquier método del componente Al tener tanta flexibilidad es más complicado de

probar

Page 101: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Variaciones del patrón El nodo raíz: para mejorar la manejabilidad del

sistema, algunas implementaciones del patrón Composite definen un objeto distinto que actúa como base para el árbol

Ramificación con reglas: hay veces en estructuras complejas que es necesario imponer restricciones en las composiciones

Page 102: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Patrones Estructurales

Composite (Compuesto)

Patrones relacionados Chain of Responsability Flyweight Iterator Visitor

Page 103: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.

Ejercicio 7

Crea una estructura de datos orientada a objetos que permita almacenar expresiones y que permite calcular su valor 5 + (5 * (2 – 9)) 8 / ( (14 * 34) + (22 + 4) )