Ingeniería del Software de
Gestión II
Grupo de Ingeniería del Software
Tema 7:
Índice
♦ Introducción
♦ Patrones de diseño de uso común
♦ Bibliografía
Índice
♦ Introducción
♦ Patrones de diseño de uso común
♦ Bibliografía
Dónde estamos
♦ Conocemos
♦ La diferencia entre análisis y diseño
♦ Los principios de diseño y la importancia de
estos
♦ Queremos saber
♦ Qué son los patrones de diseño y cómo nos
pueden ayudar a obtener buenos diseños
♦ De dónde surgen los patrones de diseño
♦ Algunos de los patrones de diseño más
comunes: Fábrica Simple, Fábrica Abstracta,
Singleton, Fachada, Adaptador, Decorador,
Proxy, Comando, Estrategia, Método Plantilla y
Observador
Qué es un PD
Orígenes de los PP.DD
♦ Christopher Alexander
(Viena, 1936)
Qué es un PD
Orígenes de los PP.DD
Ward Cunnighan
&
Kent Beck
1. Window per Task 2. Few Panes
3. Standard Panes 4. Nouns and Verbs 5. Short Menus
Qué es un PD
Orígenes de los PP.DD
♦ 1993. Beck y Booch sufragan un retiro en las montañas de colorado. Nace el HillSide
♦ 1994. Hillside organiza la primera edición del
PLOP (Patterns Languages of Program Design). La banda de los cuatro venden más de 750 ejemplares de su libro (10 veces más que cualquier libro hasta entonces)
John
Vlissides Richard Helm Ralph
Johnson Eric
Gamma
♦ En Ingeniería del Software (Gamma95, pág. 360)
♦ Qué es un PD
Definiciones
A design pattern systematically names, motivates, and explains a general design that addresses a
recurring design problem in OO systems. …
The solution is customized and implemented to solve the problem in a particular context.
• Técnica de descripción
• Par problema-solución
• Recurrente
• Sólo el núcleo, no es una solución completa
Patrón de diseño
♦ Nombre
♦ Problema
♦ Solución
♦ Ventajas e inconvenientes
♦ Detalles de implementación
Patrones de diseño
Creacional Fábrica Abstracta, Método Fábrica,
Constructor, Prototipo, Singleton
Estructural Adaptador, Puente, Compuesto, Decorador, Fachada, Peso Mosca, Proxy
De
Comportamiento Cadena de Responsabilidad, Comando, Iterador, Mediador, Memento,
Observador, Estado, Estrategia,
Visitante, Método Plantilla
¿Dónde encuentro todo esto?
♦ Basica (de referencia):
♦ “Design Patterns”, Gamma, Helm, Johnson, Vlissides, Addison-Wesley
♦ De apoyo:
♦ Historia de los patrones
http://c2.com/cgi-bin/wiki?HistoryOfPatterns
♦ “Head First - Design Patterns”, Ed.- O’Reilly (2004). ♦ “UML y Patrones”, Craig Larman (1999).
Ejemplo: Patrón Fachada
1. Problema
♦ Se quiera proporcionar una interfaz
sencilla para un subsistema complejo
♦ Se quiera desacoplar un subsistema
de sus clientes y de otros
subsistemas, haciéndolo mas
independiente y portable
♦ Se quiera dividir los sistemas en
niveles: las fachadas serían el punto
de entrada a cada nivel
Ejemplo: Patrón Fachada
1. Problema (Ejemplo)
♦ Compilador ♦ Clases del ♦ subsistema de ♦ compilación ♦ Editor ♦ Depurador ♦ Linkador ♦ Token ♦ AnaLex ♦ AnaSin ♦ ASA ♦ TabSim ♦ Compilar()Ejemplo: Patrón Fachada
2. Solución
♦ Clases del ♦ subsistema ♦ B ♦ A ♦ C ♦ D ♦ Fachada ♦ E♦ Los clientes se comunican con el subsistema a través
de la fachada, que reenvía las peticiones a los objetos del subsistema apropiados y puede realizar también algún trabajo de traducción
♦ Los clientes que usan la fachada no necesitan acceder
Ejemplo: Patrón Fachada
3. Ventajas e Inconvenientes
♦ Oculta a los clientes de la complejidad del
subsistema y lo hace más fácil de usar
♦ Favorece un acoplamiento débil entre el
subsistema y sus clientes, consiguiendo que los
cambios de las clases del sistema sean
transparentes a los clientes
♦ Facilita la división en capas y reduce
dependencias de compilación
Ejemplo: Patrón Fachada
4. Detalles de implementación
♦ Se puede reducir aún más el
acoplamiento haciendo que la fachada
sea una clase abstracta, de forma que
se pueda escoger entre distintas
implementaciones del subsistema
♦ Usando la visibilidad de paquete de Java
puede ocultar el acceso a clases de un
subsistema.
Índice
♦ Introducción
♦ Patrones de diseño de uso común
♦ Bibliografía
Clasificación
Creacional Fábrica Abstracta, Método Fábrica,
Constructor, Prototipo, Singleton
Estructural Adaptador, Puente, Compuesto,
Decorador, Fachada, Peso Mosca, Proxy
De
Comportamiento Cadena de Responsabilidad, Comando, Iterador, Mediador, Memento, Observador, Estado, Estrategia,
La Fábrica Simple
♦ ¡OJO! Es una fábrica abstracta con un solo
producto. NO es un PD.
♦ La Fábrica Simple sirve para encapsular el código
de creación de objetos en una clase.
FormaPreguntarFactory create(…): IFormaPreguntar ... IFormaPreguntar p; p = factory.create(); ... PreguntaAzar crea llama IFormaPreguntar p = null; if (…) p = new PreguntaAzar(); else p = new PreguntaTodas(); return p; <<interface>> IFormaPreguntar PreguntaTodas
A lo que crea una fábrica se les denomina productos
El Patron Fábrica Abstracta
♦ El PD Fábrica Abstracta proporciona una interfaz para crear familias de objetos relacionados o dependientes sin necesidad de especificar sus clases concretas
Client AbstractFactory createProductA() createProductB() ConcreteFactory1 createProductA() createProductB()
Cada fábrica concreta crea el conjunto entero de productos.
La AbstractFactory define la interfaz de las fábricas concretas, que consiste en un conjunto de métodos para crear productos. ConcreteFactory2 createProductA() createProductB() AbstractProductA ProductA1 ProductA2 AbstractProductB ProductB1 ProductB2
Las fábricas concretas implementan las familias de producto. Para crear un producto, el cliente usa una de estas fábricas en lugar de instanciarlo directamente
El Patrón Singleton
♦ El PD Singleton garantiza que una clase sólo tenga una instancia y proporciona un punto de acceso global a ella.
PrinterManager
- instance: PrinterManager = null - PrinterManager()
+ getInstance(): PrinterManager
+ print(Document d) if (instance == null) instance = new PrinterManager(); return instance
PrinterManager es un singleton que maneja la cola de impresión para una impresora
...
PrinterManager p = PrinterManager.getInstance(); p.print(d);
Quien quiera usar el
PrinterManager lo hará con este código… PrinterManager (Clase) instance (objeto de tipo PrinterManager)
El único objeto de tipo PrinterManager está en el atributo instance de la clase PrinterManager
El “truco” es poner el constructor privado. Así se evita que otras clases puedan crear instancias de
Clasificación
Creacional Fábrica Abstracta, Método Fábrica, Constructor, Prototipo, Singleton
Estructural Adaptador, Puente, Compuesto, Decorador, Fachada, Peso Mosca, Proxy
De
Comportamiento Cadena de Responsabilidad, Comando, Iterador, Mediador, Memento, Observador, Estado, Estrategia,
El Patrón Adaptador
♦ El PD Adaptador convierte la interfaz de una clase en otra interfaz que espera el cliente. El adaptador permite que clases con interfaces incompatibles puedan funcionar
juntas. <<interface>>
ILogin
login(name,pass): Boolean
HotmailLoginAdapter
login(name, pass): Boolean
HotmailLogin
authenticate(name, pass): Boolean
Client
adaptee
FileInputStream
El Patrón Decorador
♦ El PD Decorador añade responsabilidades adicionales a un objeto dinámicamente. Los decoradores proporcionan una alternativa flexible a hacer subclases para extender la funcionalidad. read() read() Inflater Input Stream read() InputStream read() Decorator read() CipherInputStream read() InflaterInputStream read() FileInputStream read()
Los decoradores tienen el mismo supertipo que los objetos que decoran Añade su propio
comportamiento antes o después de delegar en el objeto que decora
Un objeto se puede decorar con varios decoradores
Imagen basada en el libro Head First Design Patterns, O’Reilly
Cipher Input Stream
El Patrón Fachada
♦ El PD Fachada proporciona una interfaz unificada a un conjunto de interfaces de un subsistema. La fachada define una interfaz de alto nivel que hace al subsistema más fácil de usar.
Compilador
Clases del subsistema de compilación
Editor Linkador Depurador
Token AnaLex
AnaSin
ASA TabSim
El Patrón Proxy
♦ El PD Proxy proporciona un sustituto a otro objeto para controlar su acceso. <<interface>> Image paintImage(Graph ics g) ImageFile paintImage(Graphics g) ImageProxy paintImage(Graphics g) realImage Una imagen (ImageFile) Un proxy de la imagen (ImageProxy) Un objeto que muestra una imagen
Es el objeto que carga la imagen realmente Actúa de proxy para
mostrar una imagen de “Loading” mientras carga la imagen
No sabe que está usando un proxy. Para él resulta totalmente transparente
realImage.paintImage(g) image.paintImage(g)
Clasificación
Creacional Fábrica Abstracta, Método Fábrica, Constructor, Prototipo, Singleton
Estructural Adaptador, Puente, Compuesto,
Decorador, Fachada, Peso Mosca, Proxy
De
Comportamiento Cadena de Responsabilidad, Comando, Iterador, Mediador, Memento,
Observador, Estado, Estrategia,
El Patrón Estrategia
♦ El PD Estrategia define una familia de algoritmos, los encapsula y los hace intercambiables. Permite que el algoritmo varíe independientemente del cliente.
CasillaCentral pregunta(): Boolean Estrategias (Formas de preguntar) <<interface>> IFormaPreguntar pregunta(): Boolean PreguntaAzar pregunta(): Boolean PreguntaTodas preguntar(): Boolean PreguntaElegida preguntar(): Boolean formaPreguntar
El Patrón Método Plantilla
♦ El PD Método Plantilla define el esqueleto de un
algoritmo en un método, dejando algunos pasos a sus subclases, es decir, deja que las subclases redefinan ciertos pasos del algoritmo sin cambiar su estructura
Bebida preparar() hervir() ponerEnVaso() echar() condimentar() Té echar() condimentar() Café echar()
public final void preparar() { hervir(); echar(); ponerEnVaso(); condimentar(); } Método plantilla Método primitivo (abstracto) Método gancho
(se da una implementación por defecto que se puede refinar opcionalmente)
Métodos concretos (finales)
Observers
El Patrón Observador
♦ El PD Observador define una dependencia uno-a-varios entre objetos de manera que cuando un objeto cambia de estado, se notifica a todas sus dependencias y se actualizan automáticamente. <<interface>> Subject register(Observer o) remove(Observer o) notifyObservers() WeatherData register(Observer o) remove(Observer o) notifyObservers() getTemperature(): float getHumidity(): float measurementsChanged() <<interface>> Observer
update(temp: float, hum: float)
CurrentConditionsDisplay update(temp, hum) display() StatisticsDisplay update(temp, hum) display() ExternalDisplay update(temp, hum) display() observers * subject subject WeatherData (Subject) StatisticsDisplay (Observer) ExternalDisplay (Observer) CurrentConditio nsDisplay (Observer) Los observadores se registran utilizando el método register El sujeto observado avisa a los observadores cuando se ha producido algún cambio 13ºC, 72% 13ºC, 72%
Índice
♦ Introducción
♦ Patrones de diseño de uso común
♦ Bibliografía
Bibliografía
♦ Basica (de referencia):
♦ “Design Patterns”, Gamma, Helm, Johnson, Vlissides, Addison-Wesley
♦ De apoyo:
♦ “Head First - Design Patterns”, Ed.- O’Reilly (2004). ♦ “UML y Patrones”, Craig Larman (1999).