17 ¿A qué ayudan los patrones? Utilizan bastante la delegación Forma de hacer que la composición sea tan potente como la herencia. Un objeto receptor delega operaciones en su delegado Presente en muchos patrones: State, Strategy, Visitor,.. Caso extremo de composición, muestra que siempre puede sustituirse la herencia por composición.
18 Delegación
19 Delegación ()
20 ¿A qué ayudan los patrones? La clave para la reutilización es anticiparse a los nuevos requisitos y cambios, de modo que los sistemas evolucionen de forma adecuada. Cada patrón permite que algunos aspectos de la estructura del sistema puedan cambiar de forma independiente a otros aspectos. Facilitan reuso interno, extensibilidad y mantenimiento.
21 Causas comunes de rediseño i) Crear un objeto indicando la clase. ii) Dependencia de operaciones específicas iii) Dependencia de plataformas hardware o software iv) Dependencia sobre representación de objetos. v) Dependencias de algoritmos vi) Acoplamiento fuerte entre clases vii) Extender funcionalidad mediante subclases viii) Incapacidad de cambiar clases convenientemente
22 Patrones frente a esos peligros i) Abstract factory, Method factory, Prototype ii) Chain of Responsability, Command iii) Abstract factory, Bridge iv) Abstract factory, Bridge, Memento, Proxy, v) Builder, Iterator, Strategy, Template Method, Visitor vi) Abstract factory, Bridge, Chain of Responsability, Command, Facade, Mediator, Observer vii) Bridge, Chain of Responsability, Composite, Decorator, Observer, Strategy viii) Adapter, Decorator, Visitor
23 ¿Cómo seleccionar un patrón? Considera de que forma los patrones resuelven problemas de diseño Lee la sección que describe el propósito de cada patrón Estudia las interrelaciones entre patrones Analiza patrones con el mismo propósito Examina las causas de rediseñar Considera que debería ser variable en tu diseño
24 ¿Cómo usar un patrón? Lee el patrón, todos sus apartados, para coger una visión global. Estudia la Estructura, Participantes y Colaboraciones Mira el ejemplo de código Asocia a cada participante del patrón un elemento software de tu aplicación. Implementa las clases y métodos relacionados con el patrón.
25 Contenidos Introducción a los patrones de diseño GoF Patrones de creación Factoría Abstracta, Builder, Método Factoría, Prototipo, Singleton Patrones estructurales Adapter, Bridge, Composite, Decorador, Fachada, Flyweight, Proxy Patrones de comportamiento Cadena de Responsabilidad, Command, Iterator, Intérprete, Memento, Mediador, Observer, Estado, Estrategia, Método Plantilla, Visitor
26 Patrones de Creación Abstraen el proceso de creación de objetos. Ayudan a crear sistemas independientes de cómo los objetos son creados, compuestos y representados. El sistema conoce las clases abstractas Flexibilidad en qué se crea, quién lo crea, cómo se crea y cuándo se crea.
27 Ejemplo: Laberinto
public class JuegoLaberinto { public Laberinto makeLaberinto () { Laberinto unLab = new Laberinto(); Habitacion h1 = new Habitacion(1); Habitacion h2 = new Habitacion(2); Puerta unaPuerta = new Puerta(1,2)
unLab .addHabitacion (h1); unLab .addHabitacion (h2);
h1.setLado(Norte, new Pared() ); h1.setLado(Sur, new Pared() ); h1.setLado(Este, new Pared() ); h1.setLado(Oeste,unaPuerta);
h2.setLado(Norte, new Pared); … return unLab;} }
29 Ejemplo: Laberinto Poco flexible ¿Cómo crear laberintos con otros tipos de elementos como habitacionesEncantadas o puertasQueEscuchan?
Patrones de creación permiten eliminar referencias explícitas a clases concretas desde el código que necesita crear instancias de esas clases.
30 Abstract Factory (Factoría Abstracta) Propósito Proporcionar una interfaz para crear familias de objetos relacionados o dependientes sin especificar la clase concreta Motivación Un toolkit interfaz de usuario que soporta diferentes formatos: Windows, Motif, X-Windows,..
Motivación (Gp:) WidgetFactory (Gp:) createScroolBar() (Gp:) CreateWindow() (Gp:) MotifWidgetFactory (Gp:) createScroolBar() (Gp:) createWindow() (Gp:) PMWidgetFactory (Gp:) createScroolBar() (Gp:) createWindow() (Gp:) PMWindow (Gp:) ScrollBar (Gp:) PMScroolBar (Gp:) MotifScroolBar (Gp:) Window (Gp:) MotifWindow (Gp:) Cliente
Factoría Abstracta
32 Estructura (Gp:) AbstractFactory (Gp:) CreateProductA() (Gp:) CreateProductB() (Gp:) ConcreteFactory1 (Gp:) createProductA() (Gp:) createProductB() (Gp:) ConcreteFactory2 (Gp:) createProductA() (Gp:) createProductB() (Gp:) ProdA2 (Gp:) AbstrProdB (Gp:) ProdB2 (Gp:) ProdB1 (Gp:) AbstrProdA (Gp:) ProdA1 (Gp:) Cliente
Factoría Abstracta
33 Factoría Abstracta Aplicabilidad Un sistema debería ser independiente de cómo sus productos son creados, compuestos y representados Un sistema debería ser configurado para una familia de productos. Una familia de objetos “productos” relacionados es diseñada para ser utilizado juntos y se necesita forzar la restricción.
34 Factoría Abstracta Consecuencias Aísla a los clientes de las clases concretas de implementación. Facilita el intercambio de familias de productos. Favorece la consistencia entre productos Es difícil soportar nuevos productos.
35 Factoría Abstracta Implementación Factorías como singleton. Se necesita una subclase de AbstractFactory por cada familia de productos que redefine un conjunto de métodos factoría. Posibilidad de usar el patrón Prototype. Definir factorías extensibles: AbstractFactory sólo necesita un método de creación.
36 Ejemplo 1: Laberinto public class FactoriaLaberinto { public Laberinto makeLaberinto { return new Laberinto();} public Pared makePared {return new Pared();}; public Habitacion makeHabitacion(int n) { return new Habitacion(n); }; public Puerta makePuerta (Habitacion h1, Habitacion h2) {return new Puerta(h1,h2);} }
37 public class JuegoLaberinto { public Laberinto makeLaberinto (FactoriaLaberinto factoria) { Laberinto unLab = factoria.makeLaberinto(); Habitacion h1 = factoria.makeHabitacion(1); Habitacion h2 = factoria.makeHabitacion(2); Puerta unaPuerta = factoria.makePuerta(h1,h2); unLab.addHabitacion(h1); unLab.addHabitacion(h2); h1.setLado(Norte, factoria.makePared() ); h1.setLado(Este, unaPuerta) … h2.setLado(Oeste, unaPuerta); h2.setLado(Sur, factoria.makePared() ) return unLab; } } Ejemplo 1: Laberinto
38 Builder (Constructor) Propósito Separa la construcción de un objeto complejo de su representación, así que el mismo proceso de construcción puede crear diferentes representaciones. Motivación Un traductor de documentos RTF a otros formatos. ¿Es posible añadir una nueva conversión sin modificar el traductor?
39 Motivación (Gp:) ASCIIConversor (Gp:) convertirCaracter() (Gp:) getTextoASCII() (Gp:) ConversorTeX (Gp:) convertirCaracter() (Gp:) convertirCambioFont() (Gp:) convertirParrafo() (Gp:) getTextoTeX() (Gp:) ConversorTexto (Gp:) convertirCaracter() (Gp:) convertirCambioFont() (Gp:) ConvertirParrafo() (Gp:) <> (Gp:) RTFTraductor (Gp:) parseRTF() (Gp:) TextoASCII (Gp:) TextoTeX
Builder
40 parseRTF { while (t = “obtener siguiente token”) { switch(t.tipo) { case Car: conversor.convertirCaracter(t.char);break; case Font: conversor.convertirCambioFont(t.font);break; case Par: conversor.convertirParrafo(); break } } }
ConversorTeX ctex = new ConversorTeX() RTFTraductor trad = new RTFTraductor (ctex, doc) trad.parseRTF(doc) TextoTex texto = conversorTex.getTextoTeX():
Builder
Página anterior | Volver al principio del trabajo | Página siguiente |