Bridge, Builder & Interpreter Herrera, Mauricio Navia, Andrés Villalba, Yenny Patron Bridge Madre de los Patrones de Diseño Patron Bridge > Sinopsis • Desacoplar una abstracción de su implementación para que ambas puedan cambiar independientemente. > Contexto Cuando una abstracción puede tener varias posibles representaciones, una forma de conseguirlo es a través de la herencia. Una clase abstracta define la interface de la abstracción y las subclases concretas. 3 Fuerzas > Se quiere evitar un enlace permanente entre una abstracción y su implementación. > Tanto la abstracción como la implementación deban ser extensibles mediante derivación independientemente. > Se quiere aislar a los clientes de cambios en la implementación evitando recompilaciones de código. > Se quiera compartir una misma implementación entre múltiples objetos. 4 Solucion (estructura) 5 Solucion (participantes) > Abstracción: define la interfaz de la abstracción y mantiene una referencia a un objeto de tipo Implementador. > AbstracciónRefinada: amplía la interfaz definida por Abstracción. > Implementador: define la interfaz para las clases de implementación, que no tiene porqué corresponderse exactamente con la de Abstracción, suele ser de más bajo nivel. > ImplementadorConcreto: implementa de una forma concreta la interfaz de Implementador. 6 Consecuencias > Favorece la división en niveles de un sistema. Los niveles superiores de un sistema solo tienen que conocer la abstracción y el implementador no el implementador concreto. > Ambas jerarquías pueden ampliarse independientemente mediante herencia. > Oculta a los clientes los detalles de las implementaciones concretas. 7 Builder Patrón de Diseño Generalidades > Clasificación Creacional. > Intención Separar la construcción de un objeto complejo de su representación de modo que en el mismo proceso de construcción se pueda crear diferentes representaciones. > Aplicabilidad • El Algoritmo para la creación de un objeto complejo debe • 9 ser independiente de las partes que conforman el objeto y de como estas están ensambladas. El proceso de construcción debe permitir diferentes representaciones de los objetos que se construye. Estructura 10 Colaboraciones • El Cliente crea el objeto Director y lo configura con el objeto constructor deseado. • El Director notifica al constructor cuando parte del producto se debe construir. • El constructor maneja los requerimientos del director y agrega partes al producto. • El Cliente recupera el producto desde el constructor. 11 11 Consecuencias • Permite variar las representaciones internas de un producto. • Aislamiento del código para construcción y representación. • Da mejor control sobre los procesos de construcción. 12 Implementación • Típicamente se debe crear una clase Concrete Builder que defina operaciones. • Interfaces de Ensamblaje y Construcción de Productos. • No se recomienda tener una clase abstracta del Producto. • Recomienda dejar algunos métodos vacios en la clase Abstract Builder. 13 Usos Conocidos > Usos Conocidos: • • • Fue un patrón común para el lenguaje SmallTalk. Aplicaciones de procesamiento de texto RTF The Service Configurator Framework de la ACE usa un constructor para construir componentes de servicios de redes que son enlazados dentro de un servidor en tiempo de corrida (run-time). > Patrones Relacionados: • 14 Abstract Factory (87) Ejemplo 15 Ejemplo 16 Ejemplo 17 Interpreter Patrón de Diseño Introducción > Propósito Dado un Lenguaje, definir la representación de una gramática y un interpretador, que pueda computar entradas de ese Lenguaje. > Motivación Existen problemas particulares que pueden expresarse en función de algún Lenguaje. > Primer Ejemplo: Expresiones Regulares 19 Descripción (1) Este patrón utiliza una Clase para representar cada Regla de la Gramática, siendo los símbolos del lado izquierdo de cada regla una Instancia de la Clase. 20 20 Descripción (2) Cada Expresión Regular definida por esta gramática puede ser representada mediante un Árbol Abstracto de Sintaxis que se elabora a partir de cada Instancia de la Clase. raining & (dogs | cats) * 21 21 Aplicabilidad La Gramática es Simple. En caso contrario, una mejor alternativa son los Parsers. La Eficiencia no es uno de los aspectos más importantes. En este caso hay que traducir el input a una forma intermedia. 22 22 Estructura y Participantes 23 > El Cliente construye el Árbol Sintáctico Abstracto de Expresiones No Terminales, e instancias de la Clase Expresion Terminal. Luego inicializa el contexto e invoca al Interpretador. > Cada nodo correspondiente a Expresiones No Terminales define al interpretador en función de subexpresiones. > Las Operaciones en cada nodo utilizan el Contexto para almacenar y acceder al Estado del interpretador. 23 Consecuencias Gramáticas Fáciles de cambiar y extender. Herencia. Fácil Implementación. Similitud. Gramáticas Complejas son dificiles de Mantener. Multi-Clases. Agregar nuevas formas de interpretar las cosas es Sencillo. 24 24 Implementación Creación del Árbol Sintactico Abstracto: no se especifica como crear el arbol. Parser o Cliente Definición de la operación del intérprete: no hay que definirla en cada Clase. Visitor Compartimiento de símbolos Terminales. Flyweight 25 25 Patrones Relacionados > El Árbol Sintáctico Abstracto Instancia de Composite. es una > Flyweight permite compartir símbolos terminales del Árbol Sintáctico Abstracto . > Se puede utilizar un Iterator para recorrer la estructura. > Visitor puede usarse para mantener el comportamiento en cada nodo del Árbol Sintáctico Abstracto en una Clase. 26 Ejemplos “Teóricos” Gramáticas para computar las palabras de un Lenguaje. Evaluador de expresiones booleanas. Búsquedas y comparaciones de cadenas. 27 27 Un Ejemplo más “Concreto” Notas Musicales: Un sonido y su duración puede ser representado en notación musical en un pentagrama. Esta notación provee el Lenguaje de la Música. Los músicos que reproducen los sonidos de la partitura pueden imitar la nota y la duración original de cada uno de ellos representado. . 28 28