2. ¿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
3. ¿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
4. 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
5. 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, …)
6. 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
7. 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
8. Tipos de Patrones
Existen cuatro grandes tipos de patrones de
diseño
Patrones de Creación
Patrones de Comportamiento
Patrones Estructurales
Patrones de sistema
9. 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)
10. 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
11. ¿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
12. ¿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
13. 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
14. 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
15. 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…
16. 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
17. 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
18. 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
19. 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
20. 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
21. 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);
}
...
}
22. 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
23. 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
24. Patrones de Creación
Singleton (Único)
Patrones relacionados
Abstract Factory (Factoría Abstracta)
Builder (Constructor)
Prototype (Prototipo)
25. 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(), …
26. 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
27. 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
28. 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
29. 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”
30. 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í)
31. 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)
33. 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
34. 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
35. 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)
36. 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
37. 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)
39. 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
40. 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
42. 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
43. 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)
44. 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
45. 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
46. 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
47. 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
48. 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.
49. 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
50. 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
51. 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
52. 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
53. 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
55. 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
56. 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
57. 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)
58. 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
59. Patrones de Comportamiento
Command (Comando)
Ejemplo (ver código)
En la aplicación de citas se incorpora un
comando con opciones de deshacer
60. 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
61. 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
62. 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
63. 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));
}
64. 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
65. 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
66. Patrones de Comportamiento
Iterator (Iterador)
Implementación
for(Iterator it = lista.iterator(); it.hasNext();){
Objeto o = it.next();
System.out.println(“Objeto: “+o);
}
67. 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);
}
69. 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
70. 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)
71. Ejercicio 5
Implementa los iteradores correspondientes
en el ejercicio del Dispensador de Fracciones
72. 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
73. 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)
74. 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
75. 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
76. 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
77. 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
79. 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
80. 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
81. 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
82. 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
83. 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
86. 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
87. 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
88. 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
89. 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
90. 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
91. 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
92. 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…)
93. 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
95. 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)
97. 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)
98. 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
100. 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
101. 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
103. 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) )