¿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
¿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
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
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, …)
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
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
Existen cuatro grandes tipos de patrones de diseño Patrones de Creación Patrones de Comportamiento Patrones Estructurales Patrones de sistema
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)
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
¿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
¿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
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
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
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…
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
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
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
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
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
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); }
...}
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
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
Patrones de Creación
Singleton (Único)
Patrones relacionados Abstract Factory (Factoría Abstracta) Builder (Constructor) Prototype (Prototipo)
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(), …
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
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
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
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”
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í)
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)
Patrones de Creación
Prototype (Prototipo)
Ejemplo
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
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
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)
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
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)
Patrones de Creación
Factory Method (Método Factoría)
Ejemplo (ver código)
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
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
Patrones de Creación
Factory Method (Método Factoría)
Implementación
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
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)
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
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
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
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
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.
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
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
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
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
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
Patrones de Comportamiento
Command (Comando)
Implementación
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
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
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)
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
Patrones de Comportamiento
Command (Comando)
Ejemplo (ver código) En la aplicación de citas se incorpora un
comando con opciones de deshacer
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
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
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
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));}
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
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
Patrones de Comportamiento
Iterator (Iterador)
Implementación
for(Iterator it = lista.iterator(); it.hasNext();){Objeto o = it.next();System.out.println(“Objeto: “+o);
}
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);}
Patrones de Comportamiento
Iterator (Iterador)
Ejemplo (Ver código)
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
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)
Ejercicio 5
Implementa los iteradores correspondientes en el ejercicio del Dispensador de Fracciones
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
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)
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
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
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
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
Patrones de Comportamiento
Observer (Observador)
Implementación
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
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
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
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
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
Patrones de Comportamiento
Observer (Observador)
Patrones relacionados Proxy RemoteProxy
Patrones de Comportamiento
Observer (Observador)
Ejemplo (ver código)
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
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
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
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
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
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
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…)
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
Patrones Estructurales
Composite (Compuesto)
Introducción...
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)
Patrones Estructurales
Composite (Compuesto)
Ejemplo (ver código)
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)
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
Patrones Estructurales
Composite (Compuesto)
Implementación
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
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
Patrones Estructurales
Composite (Compuesto)
Patrones relacionados Chain of Responsability Flyweight Iterator Visitor
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) )