Patrones de Diseo con ejercicios en Java micael

  • Slides: 103
Download presentation
Patrones de Diseño con ejercicios en Java micael. gallego@gmail. com

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

¿Qué es un patrón de diseño? l l Es una solución bien documentada que

¿Qué es un patrón de diseño? l l 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

¿Qué es un patrón de diseño? l l Son una forma estandarizada para representar

¿Qué es un patrón de diseño? l l Son una forma estandarizada para representar soluciones generales de problemas que se encuentran comúnmente en el desarrollo de software orientado a objetos Beneficios l l l 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

Abstracción y Reutilización l l Los patrones suponen una evolución en la abstracción y

Abstracción y Reutilización l l Los patrones suponen una evolución en la abstracción y reutilización en la programación Abstracción l l 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

Abstracción y Reutilización l l Posibilidad de usar de nuevo código ya desarrollado anteriormente

Abstracción y Reutilización l l Posibilidad de usar de nuevo código ya desarrollado anteriormente Formas de reutilización l l 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, …)

Abstracción y Reutilización l Abstracción y Reutilización en Programación Orientada a Objetos l l

Abstracción y Reutilización l Abstracción y Reutilización en Programación Orientada a Objetos l l l Abstracción funcional y de datos La encapsulación implica mejor reutilización La herencia permite formas de reutilización antes no posibles l Es posible desarrollar algoritmos de forma genérica y especializarlos creando clases hijas y redefiniendo o implementando ciertos métodos

Abstracción y Reutilización Tipo de Reutilización ¿Se puede aplicar de nuevo? ¿Qué se abstrae?

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

Tipos de Patrones l Existen cuatro grandes tipos de patrones de diseño l l

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

Tipos de Patrones l Patrones de Creación l l Facilitan y simplifican la creación

Tipos de Patrones l Patrones de Creación l l 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 l Guían el flujo de control del sistema (para facilitar la eficiencia y facilitar el mantenimiento)

Tipos de Patrones l Patrones Estructurales l l l Describen formas efectivas de partir

Tipos de Patrones l Patrones Estructurales l l l 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 l l Se aplican a la arquitectura de la aplicación Patrones más generales que los otros tipos

¿Cómo es un patrón? l Los patrones están especificados siguiendo un formulario o formato

¿Cómo es un patrón? l Los patrones están especificados siguiendo un formulario o formato estándar: l l l Nombre También conocido como – Otros nombres usuales Propiedades l Tipo - Creación, Comportamiento, Estructural o De sistema l 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

¿Cómo es un patrón? l … l l l Descripción – Que hace y

¿Cómo es un patrón? l … l l l Descripción – Que hace y como se comporta de forma detallada Implementación - ¿Cómo implementarlo? Ventajas e Inconvenientes Variantes Patrones Relacionados Ejemplo

Patrones de Creación l l l Facilitan y simplifican la creación de objetos Permiten

Patrones de Creación l l l 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

Patrones de Creación l Singleton (Único) l l Factory Method (Método Factoría) l l

Patrones de Creación l Singleton (Único) l l Factory Method (Método Factoría) l l Restringe la creación de un único objeto de una clase en todo el sistema y permite acceder a él Define un método para la creación de objetos además del constructor Builder (Constructor) l Simplifica la construcción de objetos complejos definiendo una clase cuya responsabilidad es crear objetos de otras clases

Patrones de Creación l Abstract Factory (Fábrica Abstracta) l l Prototype (Prototipo) l l

Patrones de Creación l Abstract Factory (Fábrica Abstracta) l l Prototype (Prototipo) l l Permite crear objetos de un conjunto de clases relacionadas pero sin especificar la clase concreta, solo el interfaz Define clases cuyos objetos pueden clonarse Hay muchos mas…

Patrones de Creación Singleton (Único) l Propiedades l l Tipo: Creación, Nivel: Objeto Propósito

Patrones de Creación Singleton (Único) l Propiedades l l Tipo: Creación, Nivel: Objeto Propósito l Permite tener una única instancia de esta clase en el sistema, y permite que todas las clases tengan acceso a esa instancia

Patrones de Creación Singleton (Único) l Introducción l l l Hay veces que se

Patrones de Creación Singleton (Único) l Introducción l l l 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 History. List 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 History. List

Patrones de Creación Singleton (Único) l Introducción… l Se podría crear el objeto al

Patrones de Creación Singleton (Único) l Introducción… l 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

Patrones de Creación Singleton (Único) l Aplicabilidad l l Cuando se requiera una instancia

Patrones de Creación Singleton (Único) l Aplicabilidad l l Cuando se requiera una instancia de una clase y accesible globalmente Descripción l l Asegura crear como máximo una instancia de un objeto. Ponga el constructor privado Ponga un método público estático get. Instance() 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

Patrones de Creación Singleton (Único) l Implementación l l Clase que tiene privado el

Patrones de Creación Singleton (Único) l Implementación l l Clase que tiene privado el constructor, mantiene una referencia estática al único objeto de la clase y proporciona un método estático get. Instance() para que otras clases accedan al único objeto El resto de la implementación es completamente normal

Patrones de Creación Singleton (Único) import java. util. Array. List; import java. util. Collections;

Patrones de Creación Singleton (Único) import java. util. Array. List; import java. util. Collections; import java. util. List; public class History. List { private static History. List instance = new History. List(); private List history = new Array. List(); private History. List() { } public static History. List get. Instance() { return instance; } public void add. Command(String command) { history. add(command); } public Object undo. Command() { return history. remove(history. size() - 1); } } . . .

Patrones de Creación Singleton (Único) l Ventajas l l l La clase Singleton es

Patrones de Creación Singleton (Único) l Ventajas l l l 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 l l 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

Patrones de Creación Singleton (Único) l Variaciones del patrón l Mantener varias instancias que

Patrones de Creación Singleton (Único) l Variaciones del patrón l Mantener varias instancias que pueden ser obtenidas con versiones con parámetros del método get. Instance(. . . ) l Cuando existen múltiples instancias, pueden ser de clases hijas diferentes dependiendo de los parámetros

Patrones de Creación Singleton (Único) l Patrones relacionados l l l Abstract Factory (Factoría

Patrones de Creación Singleton (Único) l Patrones relacionados l l l Abstract Factory (Factoría Abstracta) Builder (Constructor) Prototype (Prototipo)

Patrones de Creación Singleton (Único) l Patrón Singleton en la API de Java l

Patrones de Creación Singleton (Único) l Patrón Singleton en la API de Java l l l Clase java. awt. Toolkit l Variación del patrón porque Toolkit es abstracta y la instancia devuelta es de una clase hija l El método es get. Default. Toolkit() Clase java. lang. Runtime l El método es get. Runtime() Clase java. text. Date. Format l Variación del patrón porque Date. Format es abstracta l Tiene varios métodos con varias instancias get. Date. Instance(), get. Date. Instance(int style), get. Date. Time. Instance(), …

Ejercicio 1 l Aplica el patrón Singleton a la clase Gestor. IO en el

Ejercicio 1 l Aplica el patrón Singleton a la clase Gestor. IO en el juego de las Tres en Raya l De esta forma se conseguirá eficiencia, porque con un objeto Gestor. IO es suficiente en toda la aplicación

Patrones de Creación Prototype (Prototipo) l Propiedades l l Tipo: De creación, Nivel: Clase

Patrones de Creación Prototype (Prototipo) l Propiedades l l Tipo: De creación, Nivel: Clase única Propósito l Facilita la creación de objetos copia de otros objetos

Patrones de Creación Prototype (Prototipo) l Introducción l l l En muchas ocasiones es

Patrones de Creación Prototype (Prototipo) l Introducción l l l 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

Patrones de Creación Prototype (Prototipo) l Aplicabilidad l l Se utiliza el patrón Prototype

Patrones de Creación Prototype (Prototipo) l Aplicabilidad l l Se utiliza el patrón Prototype para crear un objeto que sea copia de otro Descripción l l Permite copiar el estado de un objeto Se puede utilizar en las opciones de “copiar” y “pegar”

Patrones de Creación Prototype (Prototipo) l Implementación l l l Incluir un método de

Patrones de Creación Prototype (Prototipo) l Implementación l l l 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 l l 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í)

Patrones de Creación Prototype (Prototipo) l Variaciones del patrón l l Constructor de copia,

Patrones de Creación Prototype (Prototipo) l Variaciones del patrón l l Constructor de copia, que recibe como parámetro un objeto de la misma clase y obtiene de él sus valores Patrones relacionados l l Abstract Factory (Factoría Abstracta) Factory Method (Método de Fabricación)

Patrones de Creación Prototype (Prototipo) l Ejemplo

Patrones de Creación Prototype (Prototipo) l Ejemplo

Ejercicio 2 l l l Aplica el patrón Prototype en la clase Lista del

Ejercicio 2 l l l 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

Patrones de Creación Factory Method (Método Factoría) l También conocido como l l Propiedades

Patrones de Creación Factory Method (Método Factoría) l También conocido como l l Propiedades l l Virtual Builder (Constructor Virtual) Tipo: De creación, Nivel: Clase Propósito l Permite definir un método estándar en una clase para crear objetos. Las subclases deciden la clase concreta que crear

Patrones de Creación Factory Method (Método Factoría) l Introducción l Supongamos una aplicación de

Patrones de Creación Factory Method (Método Factoría) l Introducción l Supongamos una aplicación de gestión de una lista, que permita borrar, editar y añadir valores l Esta aplicación tiene dos partes, la interfaz de usuario (un menú en modo texto) y la Lista. l La lista tiene un método para poner un valor (String) en una determinada posición (int) l public void set(int position, String value)

Patrones de Creación Factory Method (Método Factoría) l … l l Se quiere generalizar

Patrones de Creación Factory Method (Método Factoría) l … l l Se quiere generalizar la aplicación incorporando una estructura de datos tipo mapa (clave, valor) Creamos la clase abstracta Estructura. Datos (de la que heredan Lista y Mapa). Creamos la clase abstracta Selector (de la que heredan SLista y SMapa) El menú usa objetos de Estructura. Datos y Selector. De esta forma se pueden incorporar nuevas estructuras de datos

Patrones de Creación Factory Method (Método Factoría) l … l El problema está en

Patrones de Creación Factory Method (Método Factoría) l … l 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. l El patrón Método Factoría propone que exista un método en Estructura. Datos que permita crear el objeto Selector correspondiente l (Ver ejemplo)

Patrones de Creación Factory Method (Método Factoría) l Ejemplo (ver código)

Patrones de Creación Factory Method (Método Factoría) l Ejemplo (ver código)

Patrones de Creación Factory Method (Método Factoría) l Aplicabilidad l l l Cuando se

Patrones de Creación Factory Method (Método Factoría) l Aplicabilidad l l l 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

Patrones de Creación Factory Method (Método Factoría) l Descripción l Existe un método de

Patrones de Creación Factory Method (Método Factoría) l Descripción l Existe un método de fabricación en una clase abstracta (Creator) que debe ser implementado por las clases hijas (Concrete. Creator). l Ese método devuelve objetos que heredan de una clase abstracta (Product) Son las Concrete. Creator las que deciden la clase que hereda de Product (Cocrete. Product) que deben instanciar l

Patrones de Creación Factory Method (Método Factoría) l Implementación

Patrones de Creación Factory Method (Método Factoría) l Implementación

Patrones de Creación Factory Method (Método Factoría) l Ventajas e Inconvenientes l l Con

Patrones de Creación Factory Method (Método Factoría) l Ventajas e Inconvenientes l l 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

Patrones de Creación Factory Method (Método Factoría) l Variaciones del Patrón l l Creator

Patrones de Creación Factory Method (Método Factoría) l Variaciones del Patrón l l Creator puede tener factory. Method concreto y proporcionar una implementación por defecto El método de fabricación puede tomar parámetros y puede instanciar los Concrete. Product dependiendo del parámetro Creator y Product pueden ser interfaces Patrones relacionados l l l Abstract Factory (Fábrica Abstracta) Prototype (Prototipo) Template Method (Método Plantilla)

Ejercicio 3 l l Incorpora una nueva implementación del Tablero del juego de las

Ejercicio 3 l l 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

Patrones de Comportamiento l l Están relacionados con el flujo de control del sistema

Patrones de Comportamiento l l 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

Patrones de Comportamiento l Chain of Responsability (Cadena de Responsabilidad) l l Command (Comando)

Patrones de Comportamiento l Chain of Responsability (Cadena de Responsabilidad) l l Command (Comando) l l 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 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) l Define un intérprete para un lenguaje

Patrones de Comportamiento l Iterator (Iterador) l l Proporciona una forma coherente de acceder

Patrones de Comportamiento l Iterator (Iterador) l l Proporciona una forma coherente de acceder secuencialmente a los elementos de una colección, independientemente del tipo de colección Mediator (Mediador) l Simplifica la comunicación entre los objetos de un sistema introduciendo un único objeto que gestiona la distribución de mensajes entre los otros

Patrones de Comportamiento l Observer (Observador) l l State (Estado) l l Proporciona a

Patrones de Comportamiento l Observer (Observador) l l State (Estado) l l Proporciona a los componentes una forma flexible de enviar mensajes de difusión a los receptores interesados Permite modificar fácilmente el comportamiento de un objeto en tiempo de ejecución Strategy (Estrategia) l Define un grupo de clases que representa un conjunto de posibles comportamientos. Estos comportamientos pueden ser fácilmente intercambiados.

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

Patrones de Comportamiento l Visitor (Visitante) l 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

Patrones de Comportamiento Command (Comando) l Propiedades l l l Tipo: De comportamiento Nivel:

Patrones de Comportamiento Command (Comando) l Propiedades l l l Tipo: De comportamiento Nivel: Objeto Propósito l Encapsular un comando en un objeto de tal forma que pueda ser almacenado, pasado a métodos y devuelto igual que cualquier otro objeto

Patrones de Comportamiento Command (Comando) l Introducción l l Cuando un usuario selecciona una

Patrones de Comportamiento Command (Comando) l Introducción l l 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

Patrones de Comportamiento Command (Comando) l Aplicabilidad l l l Dar soporte para deshacer

Patrones de Comportamiento Command (Comando) l Aplicabilidad l l l 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

Patrones de Comportamiento Command (Comando) l Descripción l l l Una aplicación que no

Patrones de Comportamiento Command (Comando) l Descripción l l l 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

Patrones de Comportamiento Command (Comando) l Implementación

Patrones de Comportamiento Command (Comando) l Implementación

Patrones de Comportamiento Command (Comando) l . . . l l Command: Interfaz de

Patrones de Comportamiento Command (Comando) l . . . l l Command: Interfaz de todos los comandos Invoker: El que decide cuando ejecutar el comando Receiver: El objeto sobre el que se ejecutará el comando Concrete. Command: Implementación de Command. Mantiene una referencia al Receiver para realizar las acciones cuando se le llama a execute

Patrones de Comportamiento Command (Comando) l Ventajas l l Desacopla la fuente o el

Patrones de Comportamiento Command (Comando) l Ventajas l l 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

Patrones de Comportamiento Command (Comando) l Variaciones l Deshacer: El patrón command puede ser

Patrones de Comportamiento Command (Comando) l Variaciones l 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() l Macro. Command: Se puede crear un comando que esté compuesto por otros comandos y que pueda ser gestionado de manera uniforme (usando el patrón Composite)

Patrones de Comportamiento Command (Comando) l Patrones relacionados l l Composite (Compuesto): Para implementar

Patrones de Comportamiento Command (Comando) l Patrones relacionados l l 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

Patrones de Comportamiento Command (Comando) l Ejemplo (ver código) l En la aplicación de

Patrones de Comportamiento Command (Comando) l Ejemplo (ver código) l En la aplicación de citas se incorpora un comando con opciones de deshacer

Ejercicio 4 l Incorpora el patrón Command en el programa de gestión de estructuras

Ejercicio 4 l 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

Patrones de Comportamiento Iterator (Iterador) l También conocido como l l Propiedades del patrón

Patrones de Comportamiento Iterator (Iterador) l También conocido como l l Propiedades del patrón l l l Cursor Tipo: De comportamiento Nivel: Componente Propósito l Proporcionar una forma coherente de acceder secuencialmente a los elementos de una colección, independientemente del tipo de colección subyacente

Patrones de Comportamiento Iterator (Iterador) l Introducción l l l Las estructuras de datos

Patrones de Comportamiento Iterator (Iterador) l Introducción l l l 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

Patrones de Comportamiento Iterator (Iterador) l . . . l Usar un índice que

Patrones de Comportamiento Iterator (Iterador) l . . . l Usar un índice que se va incrementando podría ser muy ineficiente para implementaciones basadas en árboles o listas enlazadas for(int i=0; i<lista. size(); i++){ System. out. println(“Elemento: “+lista. get(i)); } l 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

Patrones de Comportamiento Iterator (Iterador) l Aplicabilidad l l Proporcionar una forma uniforme, coherente

Patrones de Comportamiento Iterator (Iterador) l Aplicabilidad l l 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

Patrones de Comportamiento Iterator (Iterador) l Descripción l El interfaz Iterator tiene las siguientes

Patrones de Comportamiento Iterator (Iterador) l Descripción l El interfaz Iterator tiene las siguientes operaciones básicas l l 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

Patrones de Comportamiento Iterator (Iterador) l Implementación for(Iterator it = lista. iterator(); it. has.

Patrones de Comportamiento Iterator (Iterador) l Implementación for(Iterator it = lista. iterator(); it. has. Next(); ){ Objeto o = it. next(); System. out. println(“Objeto: “+o); }

Patrones de Comportamiento Iterator (Iterador) l Ventajas l l Se simplifica el acceso secuencial

Patrones de Comportamiento Iterator (Iterador) l Ventajas l l 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 for(Object objeto: lista){ System. out. println(“Objeto: “+objeto); } l Inconvenientes l 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

Patrones de Comportamiento Iterator (Iterador) l Ejemplo (Ver código)

Patrones de Comportamiento Iterator (Iterador) l Ejemplo (Ver código)

Patrones de Comportamiento Iterator (Iterador) l Variaciones del Patrón l l Existen iteradores que

Patrones de Comportamiento Iterator (Iterador) l Variaciones del Patrón l l 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

Patrones de Comportamiento Iterator (Iterador) l Patrones relacionados l l Factory Method (Método Factoría):

Patrones de Comportamiento Iterator (Iterador) l Patrones relacionados l l Factory Method (Método Factoría): el método iterator() es un método factoría Visitor (Visitador)

Ejercicio 5 l Implementa los iteradores correspondientes en el ejercicio del Dispensador de Fracciones

Ejercicio 5 l Implementa los iteradores correspondientes en el ejercicio del Dispensador de Fracciones

Patrones de Comportamiento Observer (Observador) l También conocido como l l Propiedades del patrón

Patrones de Comportamiento Observer (Observador) l También conocido como l l Propiedades del patrón l l l Publisher-Subscriptor (Editor-Suscriptor) Tipo: De comportamiento Nivel: Componente Propósito l Proporcionar a los componentes una forma flexible de enviar mensajes de difusión a los receptores interesados

Patrones de Comportamiento Observer (Observador) l Introducción l l l En muchas ocasiones ciertas

Patrones de Comportamiento Observer (Observador) l Introducción l l l 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 l La parte que cambia es una librería y la parte interesada está en nuestro programa l La parte que cambia es genérica y la parte interesada no se puede determinar (un campo de texto en un interfaz de usuario)

Patrones de Comportamiento Observer (Observador) l . . . l l l Lo ideal

Patrones de Comportamiento Observer (Observador) l . . . l l l 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

Patrones de Comportamiento Observer (Observador) l Aplicabilidad l l l Al menos un emisor

Patrones de Comportamiento Observer (Observador) l Aplicabilidad l l l 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

Patrones de Comportamiento Observer (Observador) l Descripción l l Considera una factura con líneas

Patrones de Comportamiento Observer (Observador) l Descripción l l 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

Patrones de Comportamiento Observer (Observador) l . . . l l l Los productores

Patrones de Comportamiento Observer (Observador) l . . . l l l 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

Patrones de Comportamiento Observer (Observador) l Implementación

Patrones de Comportamiento Observer (Observador) l Implementación

Patrones de Comportamiento Observer (Observador) l . . . l Observable l l La

Patrones de Comportamiento Observer (Observador) l . . . l Observable l l 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

Patrones de Comportamiento Observer (Observador) l . . . l Observer l l Concrete.

Patrones de Comportamiento Observer (Observador) l . . . l Observer l l Concrete. Observer l l Interfaz que usan los Observable para comunicarse con los interesados Implementa la interfaz Observer y determina en la implementación de los métodos como responder a los mensajes recibidos de Observable Event l Mantiene información sobre el evento o cambio producido que puede ser útil para el Observer

Patrones de Comportamiento Observer (Observador) l Ventajas e Inconvenientes l l l El objeto

Patrones de Comportamiento Observer (Observador) l Ventajas e Inconvenientes l l l 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

Patrones de Comportamiento Observer (Observador) l Ventajas e Inconvenientes. . . l l El

Patrones de Comportamiento Observer (Observador) l Ventajas e Inconvenientes. . . l l El principal problema del patrón es como hacer los eventos que se envían Eventos genéricos l l Son más fáciles de codificar pero puede ser difícil para un observador saber lo que ha pasado Diferentes Eventos concretos l l Los observadores saben con detalle el cambio Se complica la codificación de los eventos porque hay que considerar muchas situaciones

Patrones de Comportamiento Observer (Observador) l Variaciones del patrón l l l En algunas

Patrones de Comportamiento Observer (Observador) l Variaciones del patrón l l l 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

Patrones de Comportamiento Observer (Observador) l Patrones relacionados l l Proxy Remote. Proxy

Patrones de Comportamiento Observer (Observador) l Patrones relacionados l l Proxy Remote. Proxy

Patrones de Comportamiento Observer (Observador) l Ejemplo (ver código)

Patrones de Comportamiento Observer (Observador) l Ejemplo (ver código)

Ejercicio 6 l l Independiza la gestión del socket del control del protocolo de

Ejercicio 6 l l 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

Patrones Estructurales l l l Describen formas efectivas de particionar y combinar los elementos

Patrones Estructurales l l l 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

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

Patrones Estructurales l Adapter (Adaptador) l l Sirve como un intermediario entre dos clases, convirtiendo las interfaces de una clase para que pueda ser utilizada por otra Bridge (Puente) l 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

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

Patrones Estructurales l Composite (Compuesto) l l 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) l Proporciona una forma flexible de introducir o eliminar funcionalidad a un componente sin modificar su apariencia externa o su función

Patrones Estructurales l Facade (Fachada) l l Flyweight (Peso ligero) l l Proporciona una

Patrones Estructurales l Facade (Fachada) l l Flyweight (Peso ligero) l l Proporciona una interfaz simplificada para un grupo de subsistemas o un sistema complejo Reduce el número de objetos detallados de muy bajo nivel en un sistema mediante la compartición de objetos Proxy (Representante) l Proporciona un representante de otro objeto, por distintas razones como pueden ser el acceso, la velocidad o la seguridad

Patrones Estructurales Composite (Compuesto) l Propiedades del Patrón l l l Tipo: Estructural Nivel:

Patrones Estructurales Composite (Compuesto) l Propiedades del Patrón l l l Tipo: Estructural Nivel: Componente Propósito l 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

Patrones Estructurales Composite (Compuesto) l Introducción l l Se desea gestionar un sistema de

Patrones Estructurales Composite (Compuesto) l Introducción l l 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…)

Patrones Estructurales Composite (Compuesto) l Introducción. . . l l Para realizar una acción

Patrones Estructurales Composite (Compuesto) l Introducción. . . l l 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

Patrones Estructurales Composite (Compuesto) l Introducción. . .

Patrones Estructurales Composite (Compuesto) l Introducción. . .

Patrones Estructurales Composite (Compuesto) l Introducción. . . l l l File. System. Elem:

Patrones Estructurales Composite (Compuesto) l Introducción. . . l l l File. System. Elem: Clase padre de Fichero y Directorio File: Devuelve el tamaño del fichero Directory: Devuelve la suma de los File. System. Elem y añade el tamaño de almacenar un directorio en disco (p. e 1 kbyte)

Patrones Estructurales Composite (Compuesto) l Ejemplo (ver código)

Patrones Estructurales Composite (Compuesto) l Ejemplo (ver código)

Patrones Estructurales Composite (Compuesto) l Aplicabilidad l l l Cuando exista un componente en

Patrones Estructurales Composite (Compuesto) l Aplicabilidad l l l 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)

Patrones Estructurales Composite (Compuesto) l Descripción l Component l l Composite l l Clase

Patrones Estructurales Composite (Compuesto) l Descripción l Component l l Composite l l Clase o interface padre de todos los elementos del árbol. Especifica las operaciones Clase que representa a las ramas. Tienen una colección de Component Node l Clase hoja, contiene el comportamiento final. No pueden contener otros componentes

Patrones Estructurales Composite (Compuesto) l Implementación

Patrones Estructurales Composite (Compuesto) l Implementación

Patrones Estructurales Composite (Compuesto) l Ventajas e Inconvenientes l l l Proporciona gran flexibilidad

Patrones Estructurales Composite (Compuesto) l Ventajas e Inconvenientes l l l 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

Patrones Estructurales Composite (Compuesto) l Variaciones del patrón l l El nodo raíz: para

Patrones Estructurales Composite (Compuesto) l Variaciones del patrón l l 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

Patrones Estructurales Composite (Compuesto) l Patrones relacionados l l Chain of Responsability Flyweight Iterator

Patrones Estructurales Composite (Compuesto) l Patrones relacionados l l Chain of Responsability Flyweight Iterator Visitor

Ejercicio 7 l Crea una estructura de datos orientada a objetos que permita almacenar

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