Title: Patrones de Dise
1Patrones de Diseño
micael.gallego_at_gmail.com
2Qué 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
3Qué 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
4Abstracció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
5Abstracció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, )
6Abstracció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
7Abstracció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
8Tipos de Patrones
- Existen cuatro grandes tipos de patrones de
diseño - Patrones de Creación
- Patrones de Comportamiento
- Patrones Estructurales
- Patrones de sistema
9Tipos 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)
10Tipos 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
11Có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
12Có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
13Patrones 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
14Patrones 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
15Patrones 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
16Patrones de CreaciónSingleton (Ú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
17Patrones de CreaciónSingleton (Ú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
18Patrones de CreaciónSingleton (Ú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
19Patrones de CreaciónSingleton (Ú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
20Patrones de CreaciónSingleton (Ú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
21Patrones de CreaciónSingleton (Único)
import java.util.ArrayList import
java.util.Collections import java.util.List pub
lic 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) ...
22Patrones de CreaciónSingleton (Ú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
23Patrones de CreaciónSingleton (Ú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
24Patrones de CreaciónSingleton (Único)
- Patrones relacionados
- Abstract Factory (Factoría Abstracta)
- Builder (Constructor)
- Prototype (Prototipo)
25Patrones de CreaciónSingleton (Ú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(),
26Ejercicio 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
27Patrones de CreaciónPrototype (Prototipo)
- Propiedades
- Tipo De creación, Nivel Clase única
- Propósito
- Facilita la creación de objetos copia de otros
objetos
28Patrones de CreaciónPrototype (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
29Patrones de CreaciónPrototype (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
30Patrones de CreaciónPrototype (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í)
31Patrones de CreaciónPrototype (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)
32Patrones de CreaciónPrototype (Prototipo)
33Ejercicio 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
34Patrones de CreaciónFactory 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
35Patrones de CreaciónFactory 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)
36Patrones de CreaciónFactory 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
37Patrones de CreaciónFactory 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)
38Patrones de CreaciónFactory Method (Método
Factoría)
39Patrones de CreaciónFactory 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
40Patrones de CreaciónFactory 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
41Patrones de CreaciónFactory Method (Método
Factoría)
42Patrones de CreaciónFactory 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
43Patrones de CreaciónFactory 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)
44Ejercicio 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
45Patrones 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
46Patrones 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
47Patrones 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
48Patrones 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.
49Patrones 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
50Patrones de ComportamientoCommand (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
51Patrones de ComportamientoCommand (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
52Patrones de ComportamientoCommand (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
53Patrones de ComportamientoCommand (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
54Patrones de ComportamientoCommand (Comando)
55Patrones de ComportamientoCommand (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
56Patrones de ComportamientoCommand (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
57Patrones de ComportamientoCommand (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)
58Patrones de ComportamientoCommand (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
59Patrones de ComportamientoCommand (Comando)
- Ejemplo (ver código)
- En la aplicación de citas se incorpora un comando
con opciones de deshacer
60Ejercicio 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
61Patrones de ComportamientoIterator (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
62Patrones de ComportamientoIterator (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
63Patrones de ComportamientoIterator (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 i0 iltlista.size() i)
System.out.println(Elementolista.get(i))
64Patrones de ComportamientoIterator (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
65Patrones de ComportamientoIterator (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
66Patrones de ComportamientoIterator (Iterador)
for(Iterator it lista.iterator()
it.hasNext()) Objeto o it.next() System.out
.println(Objeto o)
67Patrones de ComportamientoIterator (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)
68Patrones de ComportamientoIterator (Iterador)
69Patrones de ComportamientoIterator (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
70Patrones de ComportamientoIterator (Iterador)
- Patrones relacionados
- Factory Method (Método Factoría) el método
iterator() es un método factoría - Visitor (Visitador)
71Ejercicio 5
- Implementa los iteradores correspondientes en el
ejercicio del Dispensador de Fracciones
72Patrones de ComportamientoObserver (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
73Patrones de ComportamientoObserver (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)
74Patrones de ComportamientoObserver (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
75Patrones de ComportamientoObserver (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
76Patrones de ComportamientoObserver (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
77Patrones de ComportamientoObserver (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
78Patrones de ComportamientoObserver (Observador)
79Patrones de ComportamientoObserver (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
80Patrones de ComportamientoObserver (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
81Patrones de ComportamientoObserver (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
82Patrones de ComportamientoObserver (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
83Patrones de ComportamientoObserver (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
84Patrones de ComportamientoObserver (Observador)
- Patrones relacionados
- Proxy
- RemoteProxy
85Patrones de ComportamientoObserver (Observador)
86Ejercicio 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
87Patrones 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
88Patrones 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
89Patrones 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
90Patrones 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
91Patrones EstructuralesComposite (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
92Patrones EstructuralesComposite (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)
93Patrones EstructuralesComposite (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
94Patrones EstructuralesComposite (Compuesto)
95Patrones EstructuralesComposite (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)
96Patrones EstructuralesComposite (Compuesto)
97Patrones EstructuralesComposite (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)
98Patrones EstructuralesComposite (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
99Patrones EstructuralesComposite (Compuesto)
100Patrones EstructuralesComposite (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
101Patrones EstructuralesComposite (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
102Patrones EstructuralesComposite (Compuesto)
- Patrones relacionados
- Chain of Responsability
- Flyweight
- Iterator
- Visitor
103Ejercicio 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) )