Patrones de Diseño con ejercicios en Java [email protected].
-
Upload
juan-antonio-olivares-bustos -
Category
Documents
-
view
221 -
download
0
Transcript of Patrones de Diseño con ejercicios en Java [email protected].
![Page 2: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/2.jpg)
¿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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/3.jpg)
¿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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/4.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/5.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/6.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/7.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/8.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/9.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/10.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/11.jpg)
¿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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/12.jpg)
¿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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/13.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/14.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/15.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/16.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/17.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/18.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/19.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/20.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/21.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/22.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/23.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/24.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/25.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/26.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/27.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/28.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/29.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/30.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/31.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/32.jpg)
Patrones de Creación
Prototype (Prototipo)
Ejemplo
![Page 33: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/33.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/34.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/35.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/36.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/37.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/38.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/39.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/40.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/41.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/42.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/43.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/44.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/45.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/46.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/47.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/48.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/49.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/50.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/51.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/52.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/53.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/54.jpg)
Patrones de Comportamiento
Command (Comando)
Implementación
![Page 55: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/55.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/56.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/57.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/58.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/59.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/60.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/61.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/62.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/63.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/64.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/65.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/66.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/67.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/68.jpg)
Patrones de Comportamiento
Iterator (Iterador)
Ejemplo (Ver código)
![Page 69: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/69.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/70.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/71.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/72.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/73.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/74.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/75.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/76.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/77.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/78.jpg)
Patrones de Comportamiento
Observer (Observador)
Implementación
![Page 79: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/79.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/80.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/81.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/82.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/83.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/84.jpg)
Patrones de Comportamiento
Observer (Observador)
Patrones relacionados Proxy RemoteProxy
![Page 85: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/85.jpg)
Patrones de Comportamiento
Observer (Observador)
Ejemplo (ver código)
![Page 86: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/86.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/87.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/88.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/89.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/90.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/91.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/92.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/93.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/94.jpg)
Patrones Estructurales
Composite (Compuesto)
Introducción...
![Page 95: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/95.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/96.jpg)
Patrones Estructurales
Composite (Compuesto)
Ejemplo (ver código)
![Page 97: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/97.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/98.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/99.jpg)
Patrones Estructurales
Composite (Compuesto)
Implementación
![Page 100: Patrones de Diseño con ejercicios en Java micael.gallego@gmail.com.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/100.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/101.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/102.jpg)
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.](https://reader034.fdocuments.net/reader034/viewer/2022051117/5665b4ad1a28abb57c9322f6/html5/thumbnails/103.jpg)
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) )