Arquitectura Del Software_patrones de Diseño

download Arquitectura Del Software_patrones de Diseño

of 210

description

FDF

Transcript of Arquitectura Del Software_patrones de Diseño

  • Patrones de Diseo

    Arquitectura del Software

    Curso 2003/2004

    Captulo 3

    Jess Garca MolinaDepartamento de Informtica y Sistemas

    Universidad de Murciahttp://dis.um.es/~jmolina

  • Patrones de diseo 2

    Contenidos

    Introduccin a los patrones de diseo GoF Patrones de creacin Patrones estructurales Patrones de comportamiento

  • Patrones de diseo 3

    Arquitectura software y patrones

    Una arquitectura orientada a objetos bien estructurada est llena de patrones. La calidad de un sistema orientado a objetos se mide por la atencin que los diseadores han prestado a las colaboraciones entre sus objetos.

    Los patrones conducen a arquitecturas ms pequeas, ms simples y ms comprensibles

    G. Booch

  • Patrones de diseo 4

    Diseo orientado a objetos

    Disear software orientado a objetos es difcil pero disear software orientado a objetos reutilizable es ms difcil todava. Diseos generales y flexibles son muy difciles de encontrar la primera vez

    Qu conoce un programador experto que desconoce uno inexperto?

    Reutilizar soluciones que funcionaron en el pasado: EXPERIENCIA

  • Patrones de diseo 5

    Patrones

    Describen un problema recurrente y una solucin. Cada patrn nombra, explica, evala un diseo

    recurrente en sistemas OO. Elementos principales:

    Nombre Problema Solucin: Descripcin abstracta Consecuencias

  • Patrones de diseo 6

    Granularidad

    Patrones de Cdigo Nivel de lenguaje de programacin

    Frameworks Diseos especficos de un dominio de aplicaciones.

    Patrones de Diseo Descripciones de clases cuyas instancias colaboran entre s

    que deben ser adaptados para resolver problemas de diseo general en un particular contexto.

    Un patrn de diseo identifica: Clases, Instancias, Roles,Colaboraciones y la distribucin de responsabilidades.

  • Patrones de diseo 7

    Patrones y frameworks

    Un framework es una coleccin organizada de clases que constituyen un diseo reutilizable para una clase especfica de software.

    Necesario adaptarlo a una aplicacin particular. Establece la arquitectura de la aplicacin Diferencias:

    Patrones son ms abstractos que los frameworks Patrones son elementos arquitecturales ms pequeos Patrones son menos especializados

  • Patrones de diseo 8

    Modelo-Vista-Control

    Utilizado para construir interfaces de usuario en Smalltalk-80.

    Basado en tres tipos de objetos: Modelo: objetos del dominio Vista: objetos presentacin en pantalla (interfaz de usuario) Controlador: define la forma en que la interfaz reacciona a

    la entrada del usuario.

    Desacopla el modelo de las vistas.

  • 0102030405060708090

    1er trim. 2do trim. 3er trim. 4to trim.

    EsteOesteNorte

    1tr3tr

    4tr2tr

    1tr. 2tr. 3tr. 4tr.Este 20 25 90 20Oeste 30 38 32 32Norte 47 47 45 45

    Vistas

    t1=20t2=25t3=90t4=20

    Modelo

  • Patrones de diseo 10

    Modelo-Vista-Control

    Utiliza los siguientes patrones: Observer Composite Strategy Decorator Factory method

  • Patrones de diseo 11

    Plantilla de definicin

    Nombre Propsito

    Qu hace?, Cul es su razn y propsito?, Qucuestin de diseo particular o problema aborda?

    Sinnimos Motivacin

    Escenario que ilustra un problema particular y cmo el patrn lo resuelve.

  • Patrones de diseo 12

    Plantilla de definicin

    Aplicabilidad En qu situaciones puede aplicarse?, Cmo las

    reconoces?, ejemplos de diseos que pueden mejorarse.

    Estructura Diagramas de clases que ilustran la estructura

    Participantes Clases que participan y sus responsabilidades

    Colaboraciones Diagramas de interaccin que muestran cmo

    colaboran los participantes.

  • Patrones de diseo 13

    Plantilla de definicin

    Consecuencias Cmo alcanza el patrn sus objetivos?, Cules son los

    compromisos y resultados de usar el patrn?, Alternativas, Costes y Beneficios

    Implementacin Tcnicas, heursticas y consejos para la implementacin Hay cuestiones dependientes del lenguaje?

    Ejemplo de Cdigo Usos conocidos Patrones relacionados

  • Patrones de diseo 14

    Clasificacin

    mbito

    Propsito

    Estructural ComportamientoCreacin

    Clase

    Objeto

    Factory Method Adapter InterpreterTemplate Method

    Abstract FactoryBuilderPrototypeSingleton

    AdapterBridge

    CompositeDecoratorFacade

    FlyweightProxy

    Chain of ResponsabilityCommand

    IteratorMediatorMementoObserver

    StateStrategyVisitor

  • Patrones de diseo 15

    A qu ayudan los patrones?

    Encontrar los objetos Tarea difcil Debemos considerar: encapsulacin, flexibilidad,

    dependencias, reutilizacin, extensibilidad, rendimiento,.. Clases del anlisis vs. Clases del diseo Clases del diseo no tienen contrapartida en el dominio

    Strategy, State, Prototype,... Clases del diseo son claves para hacer el sistema ms

    flexible.

  • 16

    A qu ayudan los patrones?

    Determinar granularidad de los objetos Facade, Flyweight, Builder, Visitor,..

    Especificar interfaces Memento, Decorator, Proxy,..

    Especificar implementacin de clases Muchos patrones dependen de la distincin entre

    herencia de implementacin y herencia de interfaces Observer, State, Chain of Responsability,

    programar hacia la interfaz, no hacia la implementacin

  • Patrones de diseo 17

    A qu ayudan los patrones?

    Especificar implementacin de clases

    programar hacia la interfaz, no hacia la implementacin

    No declarar variables de clases concretas sino abstractas.

    Patrones de creacin permiten que un sistema estbasado en trminos de interfaces y no en implementaciones.

  • A qu ayudan los patrones?

    Favorecen la reutilizacin

    HERENCIA COMPOSICION- Definicin esttica - Definicin dinmica- Sencilla de usar - Uso ms complicado- Fcil modificar la implem. - Es posible cambiar en

    estticamente pero no en t.e. tiempo de ejecucin- Se rompe la encapsulacin - No se rompe la encapsulacin

    - Requiere que se satisfaga cierta interfaz-Se puede sustituir la implem. en tiempo de ejecucin.

  • Patrones de diseo 19

    A qu ayudan los patrones?

    Favorecer la reutilizacin

    Favorecer la composicin sobre la herencia de clases

    Herencia y composicin trabajan juntasSe suele abusar de la herencia. Los diseos suelen ser ms reutilizables si dependen de la composicin.

  • Patrones de diseo 20

    A qu ayudan los patrones?

    Delegacin Forma de hacer que la composicin sea tan potente

    como la herencia. Un objeto receptor delega operaciones en su delegado Delegacin vs. forwarding Software ms flexible pero ms complicado. Difcil saber cuando conviene usarla. Presente en muchos patrones: State, Strategy, Visitor,.. Caso extremo de composicin, muestra que siempre

    puede sustituirse la herencia por composicin.

  • Patrones de diseo 21

    Delegacin

    Window

    area()

    Rectanguloanchoalto

    area()

    +rectangulo

    return ancho * altoreturn rectangulo.area

  • Patrones de diseo 22

    Ejercicio

    Supuesto Eiffel, C++ o Java, seala tres formas de escribir una rutina de ordenacin de modo que la comparacin que usa para comparar no sea fija.

  • Patrones de diseo 23

    A qu ayudan los patrones?

    La clave para la reutilizacin es anticiparse a los nuevos requisitos y cambios, de modo que los sistemas evolucionen de forma adecuada.

    Cada patrn permite que algunos aspectos de la estructura del sistema puedan cambiar independientemente de otros aspectos.

    Facilitan reuso interno, extensibilidad y mantenimiento.

  • Patrones de diseo 24

    Causas comunes de rediseo

    i) Crear un objeto indicando la clase.ii) Dependencia de operaciones especficasiii) Dependencia de plataformas hardware o softwareiv) Dependencia sobre representacin de objetos.v) Dependencias de algoritmosvi) Acoplamiento fuerte entre clasesvii) Extender funcionalidad mediante subclasesviii) Incapacidad de cambiar clases convenientemente

  • Patrones de diseo 25

    Patrones frente a esos peligros

    i) Abstract factory, Method factory, Prototypeii) Chain of Responsability, Commandiii) Abstract factory, Bridgeiv) Abstract factory, Bridge, Memento, Proxy,v) Builder, Iterator, Strategy, Template Method, Visitorvi) Abstract factory, Bridge, Chain of Responsability, Command,

    Facade, Mediator, Observervii) Bridge, Chain of Responsability, Composite, Decorator,

    Observer, Strategyviii) Adapter, Decorator, Visitor

  • Patrones de diseo 26

    Cmo seleccionar un patrn?

    Considera de que forma los patrones resuelven problemas de diseo

    Lee la seccin que describe el propsito de cada patrn

    Estudia las interrelaciones entre patrones Analiza patrones con el mismo propsito Examina las causas de redisear Considera que debera ser variable en tu diseo

  • Patrones de diseo 27

    Cmo usar un patrn?

    Lee el patrn, todos sus apartados, para coger una visin global.

    Estudia la Estructura, Participantes y Colaboraciones Mira el ejemplo de cdigo Asocia a cada participante del patrn un elemento

    software de tu aplicacin. Implementa las clases y mtodos relacionados con el

    patrn.

  • Patrones de diseo 28

    Patrones de Creacin

    Abstraen el proceso de creacin de objetos. Ayudan a crear sistemas independientes de

    cmo los objetos son creados, compuestos y representados.

    Dos tipos: Clase: usa herencia para variar la clase que es

    instanciada Objeto: delega instanciacin a otro objeto

  • Patrones de diseo 29

    Patrones de Creacin

    Se encapsula: qu clases concretas usa el sistema cmo se crean las instancias de esas clases

    El sistema conoce las clases abstractas Flexibilidad en qu se crea, quin lo crea, cmo se

    crea y cundo se crea.

  • 30

    Ejemplo: Laberinto

    Muro

    entrar()

    PuertaestaAbierta

    entrar()

    Laberinto

    addHabitacion()numHabitacion()

    Sitio

    entrar()

    Habitacionnumero

    entrar()getLado()setLado()

    +lados

  • 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 Muro());h1.setLado(Sur, new Muro());h1.setLado(Este, new Muro());h1.setLado(Oeste,unaPuerta);

    h2.setLado(Norte, new Muro);return unLab;}

    }

  • Patrones de diseo 32

    Ejemplo: Laberinto

    Poco Flexible: diseo laberinto cableado Cmo crear laberintos con otros tipos de

    elementos como habitacionesEncantadas o puertasQueEscuchan?

    Patrones de creacin permiten eliminar referencias explcitas a clases concretas desde el cdigo que necesita crear instancias de esas clases.

  • Patrones de diseo 33

    Abstract Factory (Factora Abstracta)

    Propsito Proporcionar una interfaz para crear familias de

    objetos relacionados o dependientes sin especificar la clase concreta

    Motivacin Un toolkit interfaz de usuario que soporta diferentes

    formatos: Windows, Motif, X-Windows,..

  • MotivacinWidgetFactory

    createScroolBar()CreateWindow()

    MotifWidgetFactory

    createScroolBar()createWindow()

    PMWidgetFactory

    createScroolBar()createWindow()

    PMWindow

    ScrollBar

    PMScroolBar MotifScroolBar

    Window

    MotifWindow

    Cliente

    Abstract Factory

  • EstructuraAbstractFactory

    CreateProductA()CreateProductB()

    ConcreteFactory1

    createProductA()createProductB()

    ConcreteFactory2

    createProductA()createProdcutB()

    ProdA2

    AbstrProdB

    ProdB2 ProdB1

    AbstrProdA

    ProdA1

    Cliente

    Abstract Factory

  • Patrones de diseo 36

    Abstract Factory

    Aplicabilidad Un sistema debera ser independiente de cmo sus

    productos son creados, compuestos y representados Un sistema debera ser configurado para una familia de

    productos. Una familia de objetos productos relacionados es

    diseada para ser utilizado juntos y se necesita forzar la restriccin.

    Se quiere proporcionar una librera de clases de productos y se quiere revelar slo la interfaz, no la implementacin.

  • Patrones de diseo 37

    Abstract Factory

    Consecuencias Aisla a los clientes de las clases concretas de

    implementacin. Facilita el intercambio de familias de productos. Favorece la consistencia entre productos Es difcil soportar nuevas clases de productos.

  • Patrones de diseo 38

    Abstract Factory

    Implementacin Factoras como singleton. Se necesita una subclase de AbstractFactory por cada

    clase de producto que redefine un mtodo factora. Posibilidad de usar el patrn Prototype.

    Definir factoras extensibles: AbstractFactory slo necesita un mtodo de creacin.

  • Patrones de diseo 39

    Ejemplo: Laberinto

    public class FactoriaLaberinto {public Laberinto makeLaberinto { return new Laberinto();}public Muro makeMuro {return new Muro();};public Habitacion makeHabitacion(int n)

    { return new Habitacion(n); };public Puerta makePuerta (Habitacion h1, Habitacion h2)

    {return new Puerta(h1,h2);}}

  • 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.makeMuro());h1.setLado(Este, unaPuerta)..h2.setLado(Oeste, unaPuerta);h2.setLado(Sur, factoria.makeMuro())return unLab; }

    }

  • Patrones de diseo 41

    Builder (Constructor)

    Propsito Separa la construccin de un objeto complejo de su

    representacin, as que el mismo proceso de construccin puede crear diferentes representaciones.

    Motivacin Un traductor de documentos RTF a otros formatos. Es

    posible aadir una nueva conversin sin modificar el traductor?

  • Motivacin

    ASCIIConversor

    convertirCaracter()getTextoASCII()

    ConversorTeX

    convertirCaracter()convertirCambioFont()convertirParrafo()getTextoTeX()

    ConversorTexto

    convertirCaracter()convertirCambioFont()ConvertirParrafo()

    RTFTraductor

    parseRTF()

    TextoASCII TextoTeX

    Builder

  • parseRTF {while (t = obtener siguiente token) {

    switch(t.tipo) {case Car:

    builder.convertirCaracter(t.char);break;case Font:

    builder.convertirCambioFont(t.font);break;case Par:

    builder.convertirParrafo(); break}

    }}

  • 44

    Estructura

    BuilderConcreto

    buildParte()getResultado()

    Director

    Construir()

    Builder

    buildParte()

    +builder

    para todo objeto en estructura { builder.buildParte}

    Producto

    Builder

  • Patrones de diseo 45

    Builder

    Aplicabilidad Cuando el algoritmo para crear un objeto complejo

    debe ser independiente de las piezas que conforman el objeto y de cmo se ensamblan.

    El proceso de construccin debe permitir diferentes representaciones para el objeto que se construye.

  • Patrones de diseo 46

    Builder

    Consecuencias Permite cambiar la representacin interna del producto. Separa el cdigo para la representacin y para la

    construccin. Los clientes no necesitan conocer nada sobre la estructura

    interna. Diferentes directores pueden reutilizar un mismo

    builder Proporciona un control fino del proceso de construccin.

  • Patrones de diseo 47

    Builder

    Implementacin La interfaz de Builder debe ser lo suficientemente

    general para permitir la construccin de productos para cualquier Builder concreto.

    La construccin puede ser ms complicada de aadir el nuevo token al producto en construccin.

    Los mtodos de Builder no son abstractos sino vacos. Las clases de los productos no tienen una clase

    abstracta comn.

  • Patrones de diseo 48

    Ejemplo: Laberinto

    public class BuilderLaberinto {public void buildLaberinto { };public void buildPuerta { };public void buildHabitacion(int n) { };public Laberinto getLaberinto() { };protected BuilderLaberinto() { };

    }

  • public class JuegoLaberinto {public Laberinto makeLaberinto (BuilderLaberinto builder) {

    builder.buildLaberinto();

    builder.buildHabitacion(1);builder.buildHabitacion(2);builder.buildPuerta(1,2);

    return builder.getLaberinto(); }}

    class BuilderLaberintoNormal extends BuilderLaberinto {Laberinto labActual;// se define la construccin de un laberinto con determinado tipo de// puertas y habitaciones...

    } Oculta la estructura interna

  • Patrones de diseo 50

    Factory Method (Mtodo Factora)

    Propsito Define un interfaz para crear un objeto, pero permite a

    las subclases decidir la clase a instanciar: instanciacindiferida a las subclases.

    Motivacin Una clase C cliente de una clase abstracta A necesita

    crear instancias de subclases de A que no conoce. En un framework para aplicaciones que pueden

    presentar al usuario documentos de distinto tipo: Clases Aplicacin y Documento.

    Se conoce cundo crear un documento, no se conoce de qu tipo.

  • 51

    Motivacin

    MiDocumento

    Documento

    open()close()save()revert()

    Aplicacion

    crearDocumento()nuevoDocumento()openDocumento()

    MiAplicacion

    crearDocumento()

    return new MiDocumento

    Documento dd = crearDocumento();

    setDoc.add(d);d.open()

    mtodo factoria

    Factory Method

  • 52

    Estructura

    Creador

    metodoFactoria()unaOperacion()

    ProductoConcretoCreadorConcreto

    metodoFactoria()

    Productos

  • Patrones de diseo 53

    Factory Method

    Aplicabilidad Una clase no puede anticipar la clase de objetos que debe

    crear. Una clase desea que sus subclases especifiquen los

    objetos que debe crear. Una clase delega responsabilidad a una entre varias

    sublcases clases accesorias (helper) y se quiere localizar el conocimiento de en qu subclase helper se delega.

  • Patrones de diseo 54

    Factory Method

    Consecuencias Evita ligar un cdigo a clases especficas de la aplicacin. Puede suceder que las subclases de Creador slo se crean

    con el fin de la creacin de objetos. Mayor flexibilidad en la creacin: subclases ofreciendo

    versiones extendidas de un objeto. El mtodo factora puede ser invocado por un cliente, no

    slo por la clase Creador: jerarquas paralelas

  • Patrones de diseo 55

    Linea

    crearManipulador()

    Circulo

    crearManipulador()

    ManipuladorLinea ManipuladorCirculo

    Manipulador

    downClick()drag()upClick()

    ClienteFigura

    crearManipulador()

    Factory Method

  • 56

    Factory Method

    Implementacin Dos posibilidades

    Creador es una clase abstracta con un mtodo factora abstracto.

    Creador es una clase concreta que ofrece una implementacin por defecto del mtodo factora.

    El mtodo factora puede tener un parmetro que identifica a la clase del objeto a crear.

    Se evita crear subclases de Creador con: Metaclases (Smalltalk y Java) Genericidad (C++)

  • 57

    Factora y Metaclases

    Factoria

    crear(tipo : String) : Producto

    P1 P2

    Cliente

    Producto

    return (Producto) Class.forName(tipo).newInstance()

  • Patrones de diseo 58

    Ejemplo: Laberinto

    public class JuegoLaberinto {public Laberinto nuevoLaberinto () {...};

    public Laberinto crearLaberinto() {return new Laberinto();};public Habitacion crearHabitacion(int n)

    {return new Habitacion(n);};public Muro crearMuro() {return new Muro();};public Puerta crearPuerta(Habitacion h1, Habitacion h2)

    {return new Puerta(h1,h2);};

    }

  • public Laberinto nuevoLaberinto () {Laberinto unLab = crearLaberinto();Habitacion h1 = crearHabitacion(1);Habitacion h2 = crearHabitacion(2);Puerta unaPuerta = crearPuerta(h1,h2);

    unLab.addHabitacion(h1);unLab.addHabitacion(h2);

    h1.setLado(Norte, crearMuro);h1.setLado(Este, unaPuerta)..h2.setLado(Oeste, unaPuerta);h2.setLado(Sur, crearMuro)return unLab; }

    }

  • Patrones de diseo 60

    Prototype (Prototipo)

    Propsito Especificar los tipos de objetos a crear utilizando una

    instancia prototpica, y crear nuevas instancias mediante copias del prototipo.

    Motivacin GraphicTool es una clase de un framework que permite

    crear editores grficos, que crea objetos grficos, instancias de subclases de Graphic y los aade a un documento, cmo puede hacerlo si no sabe qu objetos grficos debe crear?

  • Motivacin

    Prototype

    p = prototipo.clone();while (usuario arrastra mouse) { p.draw(nuevapos) }

    insertar p in dibujo

    Tool

    manipular()

    Pentagrama

    dibujar()clone()

    NotaMusical

    Entera

    dibujar()clone()

    Media

    dibujar()clone()

    Graphic

    dibujar()clone()

    GraphicTool

    manipular()

    +prototipo

    return copy of self

  • Estructura

    return copia de self

    PrototipoConcr1

    clone()

    PrototipoConcr2

    clone()

    Cliente

    operacion()

    (from FactoryMethod) Prototipo

    clone()

    +prototipo

    p = prototipo.clone()

    Prototype

  • Patrones de diseo 63

    Prototype

    Aplicabilidad Cuando un sistema deba ser independiente de cmo sus

    productos son creados, compuestos y representados y: las clases a instanciar son especificadas en tiempo de ejecucin. para evitar crear una jerarqua de factoras paralela a la de

    productos. cuando las instancias de una clase slo pueden encontrarse en

    uno de un pequeo grupo de estados. Inicializar un objeto es costoso

  • 64

    Prototype

    Consecuencias Al igual que con Builder y Factory Abstract oculta al

    cliente las clases producto concretas. Es posible aadir y eliminar productos en tiempo de

    ejecucin: mayor flexibilidad que los anteriores. La composicin reduce el nmero de clases que es

    necesario crear. Un objeto prototipo puede estar formado por otros

    primitivos. Reduce la necesidad de crear subclases. Posibilidad de usar clases cargadas dinmicamente.

  • 65

    Prototype

    Implementacin Importante en lenguajes que no soportan el concepto de

    metaclase, as en Smalltalk o Java es menos importante. Usar un manejador de prototipos que se encarga del

    mantenimiento de una tabla de prototipos. Implementar la operacin clone es lo ms complicado. A veces se requiere inicializar el objeto creado

    mediante copia: prototipo con operaciones set.

  • Patrones de diseo 66

    Ejemplo: Laberintopublic class FactoriaPrototipoLaberinto {

    factoriaPrototipoLaberinto (Laberinto l, Puerta p, Habitacion h, Muro m);

    {protoLab = l; protoPuerta = p; protoHab = h; protoMuro = m;}

    public Laberinto makeLaberinto() {return (Laberinto)protoLab.clone()};public Muro makeMuro {return (Muro) protoMuro.clone() };public Habitacion makeHabitacion(int n) {

    Habitacion h = (Habitacion) protoHab.clone(); h.initialize(n); return h;}

    public Puerta makePuerta (Habitacion h1, Habitacion h2) {Puerta p = (Puerta) protoPuerta.clone();p.initialize(h1,h2); return p}

    }

  • JuegoLaberinto juego;FactoriaPrototipoLaberinto LaberintoSimple =

    new FactoriaPrototipoLaberinto (new Laberinto, new Puerta, new Habitacion, new Muro);

    Laberinto unlab = juego. makeLaberinto(LaberintoSimple)

    JuegoLaberinto juego;FactoriaPrototipoLaberinto otroLaberinto =

    new FactoriaPrototipoLaberinto (new Laberinto, newPuertaQueOye, new HabitacionEncantada, new Muro);

    Laberinto unlab = juego. makeLaberinto(otroLaberinto)

  • 68

    Factora Abstracta con Prototipo

    // crea objetos de una jerarqua de productosclass Factoria {

    private HashTable catalogo;public Producto getProducto(String s) {

    return (Producto) ((Producto) catalogo.get(s)).clone();}public Factoria (String familia) {inicializa el catalogo}...

    }

  • Patrones de diseo 69

    Singleton

    Propsito Asegurar que una clase tiene una nica instancia y

    asegurar un acceso global

    Motivacin Una nica instancia de la clase que maneja las ventanas,

    o de un spooler de impresoras o de un sistema de ficheros o de una factora.

    La clase se encarga de asegurar que exista una nica instancia y de su acceso.

  • 70

    Estructura

    return unicaInstancia

    SingletonunicaInstanciadatoSingleton

    instancia()operacionSingleton()getSingleton()

    Singleton

    Singleton.instancia().operacionSingleton()

  • Patrones de diseo 71

    Singleton

    Aplicabilidad Debe existir una nica instancia de una clase, accesible

    globalmente.

    Consecuencias Acceso controlado a la nica instancia Evita usar variables globales Generalizar a un nmero variable de instancias La clase Singleton puede tener subclases.

  • 72

    Singleton Puede suceder que Singleton tenga subclases y el

    cliente desee asociar a UnicaInstancia un objeto de una de las subclases. Anlisis de casos en instancia() Singleton maneja un registro de singleton

    En Smalltalk con variables de clase instancia podemos conseguir que cada subclase tenga su propio singleton.

  • Singleton Implementacin Java

    public class Singleton {public static Singleton instancia()

    { if (unicaInstancia = = null){unicaInstancia = new Singleton()};

    return unicaInstancia};protected Singleton();private static Singleton unicaInstancia = null;

    Implementacin Smalltalknew

    self error: no se puede crear el objetodefault -- mtodo de clase

    UnicaInstancia isNil ifTrue: [UnicaInstancia:= super new].^UnicaInstancia.

  • Patrones de diseo 74

    Patrones estructurales

    Cmo clases y objetos se combinan para formar estructuras ms complejas.

    Patrones de clase Usan herencia (p.e. Adapter)

    Patrones de objeto Describen formas de combinar objetos para obtener nueva

    funcionalidad Posibilidad de cambiar la composicin en tiempo de

    ejecucin. Ej.: Composite, Proxy

  • Patrones de diseo 75

    Adapter / Wrapper (Adaptador)

    Propsito Convertir la interfaz de una clase en otra que el cliente

    espera. Permite la colaboracin de ciertas clases a pesar de tener interfaces incompatibles

    Motivacin Un editor grfico incluye una jerarqua que modela

    elementos grficos (lneas, polgonos, texto,..) y se desea reutilizar una clase existente TextView para implementar la clase que representa elementos de texto, pero que tiene una interfaz incompatible.

  • 76

    Motivacin

    ElemLinea

    marco()crearManipulador()

    EditorElementoGrafico

    marco()crearManipulador()

    ElemTexto

    marco()crearManipulador()

    TextView

    getExtension()

    +texto

    return text.getExtension

    return new ManipuladorTexto

    *

    Adapter / Wrapper (Adaptador)

  • 77

    Estructura Adapter/Clase

    Adaptado

    especificoMet1()

    Adaptador

    metodo1()

    especificoMet1

    ClienteObjetivo

    metodo1()

    ( )

  • 78

    Estructura Adapter/Objeto

    Cliente Objetivo

    metodo1()

    Adaptador

    metodo1()

    Adaptado

    especificoMet1()

    +adaptado

    adaptado. especificoMet1()

  • Patrones de diseo 79

    Adapter

    Aplicabilidad Se desea usar una clase existente y su interfaz no coincide

    con la que se necesita: se quiere usar una clase que invoca a un mtodo a travs de una interfaz,

    pero quiere usarse con otra clase que no implementa la interfaz

    Se desea crear una clase reutilizable que debe colaborar con clases no relacionadas o imprevistas.

    (slo adaptador-objeto) se necesita usar varias subclases y es incmodo adaptar su interfaz aplicando subclassing.

  • 80

    Adapter Consecuencias

    Un adaptador-clase no funciona cuando queramos adaptar una clase y sus subclases.

    Un adaptador-clase puede redefinir comportamiento heredado de Adaptado.

    Un adaptador-clase no implica ninguna indireccin, slo introduce un objeto.

    Un adaptador-objeto permite adaptar una clase y sus subclases, pudiendo aadir funcionalidad a todos los adaptados a la vez.

    Para un adaptador-objeto es complicado redefinir comportamiento de Adaptado.

  • 81

    Adapter Consecuencias

    La funcionalidad de Adaptador depende de la similitud entre la interfaz de las clases Objetivo y Adaptado.

    Adaptores pluggable:

    Clases que incorporan una adaptacin de interfaz

    Cmo podemos conseguir que una clase reutilizable pueda incorporarse en sistemas existentes que esperan interfaces diferentes a la de la clase?

    Ejemplo: Clase TreeDisplay para visualizar estructuras jerrquicas (widget), exige que los objetos a visualizar tengan una determinada interfaz, p.e. clase abstracta Tree?

  • 82

    Adapter

    Implementacin En C++, la clase Adaptador hereda en modo privado de

    Adaptado y en modo pblico de Objetivo. Tres posibles implementaciones de adaptadores

    plugabbles: Con operaciones abstractas Con delegacin de objetos Adaptadores parametrizados

  • Adapter

    TreeDisplay

    getChildren(Node)CreateGraphicNode(Node)display()BuilTree(Node n)

    DirectoryTreeDisplay

    getChildren(Node)createGraphicNode(Node)

    getChildren(n);for each child {

    addGraphicNode(CreateGraphicNode(child));buildTree(child)

    }

    FileSystemEntity

    adaptadoradaptado

    Objetivo, Cliente

  • AdapterCliente

    adaptadorDirectoryBrowser

    getChildren()CreateGraphicNode()createFile()deleteFile()

    FileSystemEntity

    delegate.getChildren(this,n);for each children {

    addGraphicNode(delegate.createGraphicNode(this,child));

    buildTree(child)}

    TreeDisplay

    setDelegate(delegate)display()buildTree(Node n)

    TreeAccesorDelegate

    getChildren(TreeDisplay, Node)CreateGraphicNode(TreeDisplay, Node)

    +delegate

    Objetivo

    adaptado

  • Patrones de diseo 85

    Ejercicio

    Supuesto el sistema de terminal de punto de venta, disea una solucin basada en los patrones vistos para que el sistema pueda soportar diferentes servicios externos de terceras partes para clculo de impuestos o autorizacin de pagos.

  • Patrones de diseo 86

    Bridge / Handle Propsito

    Desacoplar una abstraccin de su implementacin, de modo que los dos puedan cambiar independientemente.

    Motivacin Clase que modela la abstraccin con subclases que la

    implementan de distintos modos. Herencia hace difcil reutilizar abstracciones e

    implementaciones de forma independiente Si refinamos la abstraccin en una nueva subclase, est tendr

    tantas subclases como tena su superclase. El cdigo cliente es dependiente de la plataforma.

  • Patrones de diseo

    Bridge / Handle

    MotivacinImplementacin de una abstraccin window portable en una librera GUI.

    XWindow

    Window

    PMWindow IconWindow

    XIconWindowPMIconWindow

    Window

    XWindow PMWindow

  • Motivacin

    IconWindow

    mostrarBorde()

    TransientWindow

    mostrarCaja()

    XWindowImp

    devMostrarTexto()devMostrarLinea()

    PMWindow

    devMostrarLinea()devMostrarTexto()

    WindowImp

    devMostrarTexto()devMostrarLinea()

    Window

    mostrarTexto()mostrarRect()

    +imp

    mostrarRect()mostrarTexto() XmostrarTexto()

    mostrarRect()mostrarTexto() XmostrarLinea()

    imp.devMostrarLinea()imp.devMostrarLinea()imp.devMostrarLinea()imp.devMostrarLinea()

    Bridge / Handle

  • 89

    Estructura

    Bridge / Handle

    AbstraccionRefinadaImplemA

    operacionImp()

    ImplemB

    operacionImp()

    Implementacion

    operacionImp()

    Abstraccion

    operacion()

    +imp

    imp.operacionImp

  • Patrones de diseo 90

    Bridge

    Aplicabilidad Se quiere evitar una ligadura permanente entre una

    abstraccin y su implementacin, p.e. porque se quiere elegir en tiempo de ejecucin.

    Abstracciones e implementaciones son extensibles. Cambios en la implementacin de una abstraccin no

    deben afectar a los clientes (no recompilacin). Ocultar a los clientes la implementacin de la interfaz. Se tiene una proliferacin de clases, como suceda en la

    Motivacin.

  • Patrones de diseo 91

    Bridge

    Consecuencias Un objeto puede cambiar su implementacin en t.e. Cambios en la implementacin no motivarn

    recompilaciones de la clase Abstraccin y sus clientes. Se mejora la extensibilidad Se ocultan detalles de implementacin a los clientes

  • Bridge Implementacin

    Aunque exista una nica implementacin puede usarse el patrn para evitar que un cliente se vea afectado si cambia.

    Cmo, cundo y dnde se decide que implementacin usar?

    Constructor de la clase Abstraccion Elegir una implementacin por defecto Delegar a otro objeto, p.e. un objeto factora

    Se puede usar herencia mltiple para heredar de la abstraccin y de una implementacin concreta, pero se liga una interface a una implementacin de forma permanente.

  • Patrones de diseo 93

    Composite Propsito

    Componer objetos en estructuras jerrquicas para representar jerarquas parte/todo. Permite a los clientes manejar a los objetos primitivos y compuesto de forma uniforme.

    Motivacin Modelar figuras compuestas Modelar paquetes de valores (acciones, bonos,..)

  • 94

    Motivacin

    Linea

    dibujar()

    Rectangulo

    dibujar()

    Figura

    dibujar()add(Figura)remove(Figura)getHijo(int)

    FiguraCompuesta

    dibujar()add(Figura)remove(Figura)getHijo(int)

    Composite

  • 95

    Estructura

    Hoja

    operacion()

    Componente

    operacion()add(Componente)remove(Componente)getHijo(int)

    Composite

    operacion()add(Componente)remove(Componente)getHijo(int)

    Cliente

    +hijos

    Composite

  • Patrones de diseo 96

    Composite

    Aplicabilidad Se quiere representar jerarquas parte/todo Se quiere que los clientes ignoren la diferencia entre

    objetos compuestos y los objetos individuales que los forman.

  • Patrones de diseo 97

    Composite

    Consecuencias Jerarqua con clases que modelan objetos primitivos y

    objetos compuestos, que permite composicin recursiva. Clientes pueden tratar objetos primitivos y compuestos de

    modo uniforme. Es fcil aadir nuevos tipos de componentes. No se puede confiar al sistema de tipos que asegure que

    un objeto compuesto slo contendr objetos de ciertas clases, necesidad de comprobaciones en tiempo de ejecucin.

  • Composite Implementacin

    Referencias de componentes hijos a su padre puede ayudar a el recorrido y manejo de la estructura compuesta.

    Debe contener Componente operaciones que no tienen significado para sus subclases?

    Dnde colocamos las operaciones de aadir y eliminar hijos?

    Compromiso entre seguridad y transparencia. Transparencia: clase Componente Seguridad: clase hijo

    Puede ser necesario especificar un orden en los hijos. Uso de cach. Qu estructura de datos es la adecuada?

  • Patrones de diseo 99

    Decorator (Decorador)

    Propsito Asignar dinmicamente nuevas responsabilidades a un

    objeto. Alternativa ms flexible a crear subclases para extender la funcionalidad de una clase.

    Motivacin Algunas veces se desea aadir atributos o comportamiento

    adicional a un objeto concreto no a una clase. Ejemplo: bordes o scrolling a una ventana. Herencia no lo permite.

  • Motivacin

    TextView

    mostrar()

    VisualComponente

    mostrar()

    Decorator

    mostrar() +componente

    ScrollDecoratorposicionScroll

    mostrar()scrollTo()

    BorderDecoratoranchoBorde

    mostrar()mostrarBorde()

    componente.mostrar

    super.mostrar;mostrarBorde

    Decorator (Decorador)

  • MotivacinunBorderDecorator

    unScrollDecorator

    unTextView

    Decorator (Decorador)

  • Estructura

    componente.operacion

    CompConcreto

    operacion()

    Componente

    operacion()

    Decorator

    operacion() +componente

    DecoratorConcrAestadoAdicional

    operacion()

    DecoratorConcrBestadoAdicional

    operacion()comportAdicional()

    super.operacion;comportAdicional

    Decorator (Decorador)

  • Patrones de diseo 103

    Decorator (Decorador)

    Aplicabilidad Aadir dinmicamente responsabilidades a objetos

    individuales de forma transparente, sin afectar a otros objetos.

    Responsabilidades de un objeto pueden ser eliminadas. Para evitar una explosin de clases que produce una

    jerarqua inmanejable.

  • Decorator (Decorador)

    Consecuencias Ms flexible que la herencia: responsabilidades pueden

    aadirse y eliminarse en tiempo de ejecucin. Diferentes decoradores pueden ser conectados a un mismo

    objeto. Reduce el nmero de propiedades en las clases de la parte

    alta de la jerarqua. Es simple aadir nuevos decoradores de forma

    independiente a las clases que extienden. Un objeto decorador tiene diferente OID al del objeto que

    decora. Sistemas con muchos y pequeos objetos.

  • 105

    Decorator (Decorador)

    Implementacin La interfaz de un objeto decorador debe conformar con la

    interfaz del objeto que decora. Clases decorador deben heredar de una clase comn.

    Componentes y decoradores deben heredar de una clase comn que debe ser ligera en funcionalidad.

    Si la clase Componente no es ligera, es mejor usar el patrn Strategy que permite alterar o extender el comportamiento de un objeto.

    Un componente no sabe nada acerca de sus decoradores, con Strategy sucede lo contrario.

  • 106

    Decorator (Decorador)

    Implementacin El decorador enva los mensajes al componente que

    decora, pudiendo extender la operacin con nuevo comportamiento.

    Las clases que modelan los decoradores concretos pueden aadir responsabilidades a las que heredan de Decorator.

  • Patrones de diseo 107

    Facade / Fachada Propsito

    Proporciona una nica interface a un conjunto de interfaces de un subsistema. Define una interface de ms alto nivel que facilita el uso de un subsistema.

    Motivacin Reducir las dependencias entre subsistemas. Un entorno de programacin que ofrece una librera de

    clases que proporcionan acceso a su subsistema compilador: Scanner, Parser, ProgramNode, ByteCodeStream y ProgramNodeBuilder. Clase Compileracta como fachada.

  • EstructuraFachada

  • Patrones de diseo 109

    Facade / Fachada

    Aplicabilidad Proporcionar una interfaz simple a un subsistema. Hay muchas dependencias entre clientes y las clases que

    implementan una abstraccin. Se desea una arquitectura de varios niveles: una fachada

    define el punto de entrada para cada nivel subsistema.

  • Patrones de diseo 110

    Facade / Fachada

    Consecuencias Una fachada ofrece los siguientes beneficios:1) Facilita a los clientes el uso de un subsistema, al ocultar

    sus componentes.2) Proporciona un acoplamiento dbil entre un subsistema y

    los clientes: cambios en los componentes no afectan a los clientes.

    3) No se impide a los clientes el uso de las clases del subsistema si lo necesitan.

  • 111

    Facade / Fachada

    Implementacin Es posible reducir el acoplamiento entre clientes y

    subsistema, definiendo la fachada como una clase abstracta con una subclase por cada implementacin del subsistema.

    La fachada no es la nica parte pblica de un subsistema, sino que es posible declarar clases individuales del subsistema como pblicas (paquetes en Java, name spaceen C++).

  • Patrones de diseo 112

    Flyweight

    Propsito Uso de la comparticin para soportar eficientemente un

    gran nmero de objetos de poco tamao

    Motivacin En una aplicacin editor de documentos, modelamos los

    caracteres mediante una clase? Un flyweight es un objeto compartido que puede ser

    utilizado en diferentes contextos simultneamente. No hace asunciones sobre el contexto Estado intrnseco vs. Estado extrnseco

  • Patrones de diseo 113

    Flyweight Estado intrnseco se almacena en el flyweight y

    consiste de informacin que es independiente del contexto y se puede compartir.

    Estado extrnseco depende del contexto y por tanto no puede ser compartido.

    Objetos clientes son responsables de pasar el estado extrnseco al flyweight cuando lo necesita.

    Flyweight se usan para modelar conceptos o entidades que son muy abundantes para representarse con objetos, p.e. caracteres de un texto.

  • Flyweight Flyweight carcter de un texto:

    estado intrnseco: cdigo del carcter estado extrnseco: informacin sobre posicin y estilo

    Caracterchar c

    mostrar(contexto)intersec(point, contexto)

    Fila

    mostrar(contexto)intersec(point, contexto)

    Elemento

    mostrar(contexto)intersec(point, contexto)

    +hijos

    Columna

    mostrar(contexto)intersec(point, contexto)

    +hijos

  • EstructuraFlyweight

    operacion(estadoExt)

    FlyweightFactory

    getFlyweight()

    ClienteConcreto

    estadoIntrinseco

    operacion(estadoExt)

    ConcretoSinCompartirtodoEstado

    operacion(estadoExt)

    Flyweight

  • Patrones de diseo 116

    Flyweight

    flyweight getFlyweight (key) {if (flyweight[key]) existe {return flyweight existente}else {crear nuevo flyweight;

    aadirlo al conjunto de flyweight;return el nuevo flyweight}

    }

  • Patrones de diseo 117

    Flyweight

    Aplicabilidad Aplicarlo siempre que se cumplan las siguientes

    condiciones:1) Una aplicacin utiliza un gran nmero de objetos.2) El coste de almacenamiento es alto debido al excesivo

    nmero de objetos.3) La mayor parte del estado de un objeto puede hacerse

    extrnseco.4) Muchos grupos de objetos pueden reemplazarse por unos

    pocos objetos compartidos al separar el estado extrnseco.5) La aplicacin no depende de la identidad de los objetos.

  • Patrones de diseo 118

    Flyweight

    Consecuencias Puede introducir costes run-time debido a la necesidad de

    calcular y transferir el estado extrnseco. La ganancia en espacio depende de varios factores:

    la reduccin en el nmero de instancias el tamao del estado intrnseco por objeto si el estado extrnseco es calculado o almacenado

    Interesa un estado intrnseco calculado Se suele combinar con el Composite.

  • Patrones de diseo 119

    Flyweight

    Implementacin La aplicabilidad depende de la facilidad de obtener el

    estado extrnseco. Idealmente debe poder calcularse a partir de una estructura de objetos que necesite poco espacio de memoria.

    Debido a que los flyweight son compartidos, no deberan ser instanciados directamente por los clientes: clase FlyweightFactory.

  • Patrones de diseo 120

    Proxy

    Propsito Proporcionar un sustituto (surrogate) de un objeto para

    controlar el acceso a dicho objeto.

    Motivacin Diferir el coste de crear un objeto hasta que sea necesario

    usarlo: creacin bajo demanda. Un editor de documentos que incluyen objetos grficos. Cmo ocultamos que una imagen se crear cuando se

    necesite?: manejar el documento requiere conocer informacin sobre la imagen.

  • Motivacin

    EditorDocumentos

    Grafico

    dibujar()getExtension()store()load()

    ProxyImagennombreFichextension

    dibujar()getExtension()store()load()

    ImagenimpImagenextension

    dibujar()getExtension()store()load()

    +imagen

    if (image == null) {image = loadImage(nombreFich)}else {imagen. dibujar()}

    if (imagen == null) { return extension}else {imagen.getExtension}

    Proxy

  • 122

    EstructuraCliente(from flyweight)

    Sujeto

    operacion()

    Proxy

    operacion()

    SujetoReal

    operacion() +sujeto

    sujeto.operacion()

    Proxy

  • Patrones de diseo 123

    Proxy

    Aplicabilidad Siempre que hay necesidad de referenciar a un objeto

    mediante una referencia ms rica que una referencia normal. Situaciones comunes;1) Proxy acceso remoto (acceso a un objeto en otro espacio de

    direcciones)2) Proxy virtual (crea objetos grandes sobre demanda)3) Proxy para proteccin (controlar acceso a un objeto)4) Referencia inteligente (smart reference)

  • Patrones de diseo 124

    Proxy

    Consecuencias Introduce un nivel de indireccin para:1) Un proxy remoto oculta el hecho que objetos residen en

    diferentes espacios de direcciones.2) Un proxy virtual tales como crear o copiar un objeto bajo

    demanda.3) Un proxy para proteccin o las referencias inteligentes

    permiten realizar tareas de control sobre los objetos accedidos.

  • Patrones de diseo 125

    Proxy

    Implementacin Sobrecargar el operador de acceso a miembros (->) en

    C++. En Smalltalk, posibilidad de definir Proxy como una clase

    que hereda de nil (no comprende ningn mensaje) y redefinir doesNotUnderstand para redirigir los mensajes al objeto sujeto.

    Puede suceder que baste con definir una nica clase Proxypara todos los tipos de sujetos.

  • Patrones de diseo 126

    Patrones de comportamiento

    Relacionados con la asignacin de responsabilidades entre clases.

    Describen no solo patrones de clases y objetos, sino tambin patrones de colaboracin entre objetos.

    Caracterizan un flujo de control ms o menos complejo que ser transparente al que utilice el patrn.

    Patrones de clase: Template Method e Interpreter Patrones de objeto: Mediator, Observer,..

  • Patrones de diseo 127

    Chain of Responsibility (Cadena de Responsabilidad)

    Propsito Evita acoplar el emisor de un mensaje a su receptor

    dndole a ms de un objeto la posibilidad de manejar la solicitud. Se define una cadena de objetos, de modo que un objeto pasa la solicitud al siguiente en la cadena hasta que uno la maneja.

    Motivacin Facilidad de ayuda sensible al contexto. El objeto que proporciona la ayuda no es conocido al

    objeto (p.e. Un Button) que inicia la solicitud de ayuda.

  • 128

    Chain of Responsibility

    Motivacin

    Aplicacion1 Widget

    Dialog Button

    manejarAyuda()mostrarAyuda()

    manejador.manejarAyuda

    if puedo manejar { mostrarAyuda() }else { super manejarAyuda() }

    ManejadorAyuda

    manejarAyuda()

    +manejador

  • Patrones de diseo 129

    Chain of Responsibility

    printBoton : But ton

    OKBoton : But ton

    printDialogo : Dialog

    GuardarDialogo : Dialog

    : Aplicacion

  • 130

    Estructura

    Manejador

    manejarSolicitud()

    +sucesorCliente(from FactoryMethod)

    ManejadorConcr1

    manejarSolicitud()

    ManejadorConcr2

    manejarSolicitud()

    Chain of Responsibility

  • Patrones de diseo 131

    Chain of Responsibility

    Aplicabilidad Ms de un objeto puede manejar una solicitud, y el

    manejador no se conoce a priori. Se desea enviar una solicitud a uno entre varios objetos sin

    especificar explcitamente el receptor. El conjunto de objetos que puede manejar una solicitud

    puede ser especificado dinmicamente.

  • Patrones de diseo 132

    Chain of Responsibility

    Consecuencias Reduce acoplamiento Proporciona flexibilidad al asignar responsabilidades No se garantiza el manejo de la solicitud

  • Patrones de diseo 133

    Chain of Responsibility

    Implementacin Dos posibles formas de implementar la cadena

    Definir nuevos enlaces (en Manejador) Usar enlaces existentes (p.e. un objeto composite)

    class ManejadorAyuda {public ManejadorAyuda (ManejadorAyuda s) {sucesor = s};public void ManejarAyuda () {if sucesor != null {

    sucesor.manejarAyuda;};};private ManejadorAyuda sucesor;

    }

  • Patrones de diseo 134

    Chain of Responsibility Implementacin

    Qu sucede si tenemos diferentes tipos de solicitudes?

    En Manejador un mtodo para cada solicitud En el caso de Java, una interfaz por solicitud En Manejador un nico mtodo con un parmetro que

    representa el tipo de solicitud, por ejemplo un String. En Manejador un nico mtodo que tiene un

    parmetro de una clase Solicitud que representa la solicitud.

  • Patrones de diseo 135

    Recursion OO

    Una variante del patrn es que un objeto de la cadena pueda realizar parte del trabajo antes de pasar la solicitud al siguiente objeto: Recursin OO

    En Recursin OO no se est interesado en la organizacin de la cadena de objetos, slo que una estructura puede recorrerse.

  • Patrones de diseo 136

    Recursion OO

    Persona >> = unaPersona^self nombre = unaPersona nombre

    NombrePersona >> = unaPersona^ (self nombre = unaPersona nombre)

    and: [self apellidos = unaPersona apellidos]

    String >> = aString...

  • Patrones de diseo 137

    Chain of Responsibility

    Ejemplo 1: Java 1.0 AWT Mecanismo de delegacin de eventos: Un evento es

    pasado al componente donde ocurre que puede manejarlo o lo pasa a su contenedor.

    Ejemplo 2: Sistema de control de seguridad Existen varios sensores que transmiten el estado a un

    ordenador central. La accin de un sensor depende del contexto que lo incluye (jearqua de reas o zonas de seguridad). Un sensor pasa el evento al agregado que lo icnluye.

  • Patrones de diseo 138

    Command

    Propsito Encapsula un mensaje como un objeto, permitiendo

    parametrizar los clientes con diferentes solicitudes, aadir a una cola las solicitudes y soportar funcionalidad deshacer/rehacer (undo/redo)

    Motivacin Algunas veces es necesario enviar mensaje a un objeto sin

    conocer el selector del mensaje o el objeto receptor. Por ejemplo widgets (botones, mens,..) realizan una

    accin como respuesta a la interaccin del usuario, pero no se puede explicitar en su implementacin.

  • 139Motivacin

    MenuItem

    clicked()

    Command

    ejecutar()

    +command

    Cut

    execute()command.execute()

    Menu

    add(MenuItem)

    Aplicacion2

    add(Document)

    Document

    open()close()cut()copy()paste()

    Paste

    execute()

    +document

    document.paste

    Command

  • 140

    Estructura

    Cliente1Command

    ejecutar()

    Invocador

    Receptor

    accion()

    CommandConcretoestado

    ejecutar()

    +receptor

    receptor.accion()

    Command

  • 141

    Colaboracin

    Command

    r : Receptor : Cliente co : Command : Invocador

    1. Command (r)

    2. regist rarCommand(co)

    3. ejecutar()

    3.1. accion()

  • Patrones de diseo 142

    Command

    Aplicabilidad Parametrizar objetos por la accin a realizar (en lenguajes

    procedurales con funciones Callback: funcin que es registrada en el sistema para ser llamada ms tarde; en C++ se puede usar punteros a funciones).

    Especificar, aadir a un cola y ejecutar mensajes en diferentes instantes: un objeto Command tiene un tiempo de vida independiente de la solicitud original.

    Soportar facilidad undo/redo. Recuperacin de fallos. Modelar transacciones

  • Patrones de diseo 143

    Command Consecuencias

    Desacopla el objeto que invoca la operacin del objeto que sabe cmo realizarla.

    Cada subclase CommandConcreto especifica un par receptor/accion, almacenando el receptor como un atributo e implementando el mtodo ejecutar.

    Objetos command pueden ser manipulados como cualquier otro objeto.

    Se pueden crear command compuestos (aplicando el patrn Composite).

    Es fcil aadir nuevos commands.

  • Patrones de diseo 144

    Command

    Implementacin Cul debe ser la inteligencia de un command?

    No delegar en nadie Encontrar dinmicamente el objeto receptor y delegar en l

    Soportar undo/redo Atributos para almacenar estado y argumentos de la

    operacin. Lista de objetos commands En la lista se colocan copias.

  • Patrones de diseo 145

    Command Implementacin

    Un objeto Command es realmente un Adapter: Commandplugabble.

    Podemos evitar la jerarqua de subclases de Command si no necesitamos la facilidad undo/redo. En Smalltalk,

    self receptor perform: unSelector with: unArg

    Es posible asociar a un command ms de una accin (evento en un widget).

  • Patrones de diseo 146

    Command Ejemplo 1: Comparar dos objetos utilizando cualquier

    criterio de ordenacin: interface Comparator en Javapublic interface Comparator {

    int compare (Object o1, Object o2); }

    Un objeto Comparator puede pasado a una rutina de ordenacin o ser utilizado por una coleccin para mantener el orden de sus elementos.

    Ejemplo 2: Interfaz Observer en el patrn Observer.

  • Patrones de diseo 147

    Interpreter

    Propsito Dado un lenguaje, definir una representacin para su

    gramtica junto con un intrprete que utiliza la representacin para interpretar sentencias en dicho lenguaje.

    Motivacin Interpretar una expresin regular. Usa una clase para representar cada regla, los smbolos en la

    parte derecha son atributos. Usar si la gramtica es simple y la eficiencia no es

    importante.

  • Patrones de diseo 148

    Interpreter

    Estructura

    Cliente3

    Contexto

    ExpresionTerminal

    interpretar(Contexto)

    ExpresionAbstracta

    interpretar(Contexto)

    ExpresionNoTerminal

    interpretar(Contexto)

  • 149

    Iterator (Iterador)

    Propsito Proporciona una forma para acceder a los elementos de

    una estructura de datos sin exponer los detalles de la representacin.

    Motivacin Un objeto contenedor tal como una lista debe permitir una

    forma de recorrer sus elementos sin exponer su estructura interna.

    Debera permitir diferentes mtodos de recorrido Debera permitir recorridos concurrentes No queremos aadir esa funcionalidad a la interfaz de la

    coleccin

  • 150

    Iterator (Iterador)

    Motivacin Una clase Iterator define la interfaz para acceder a una

    estructura de datos (p.e. una lista). Iteradores externos vs. Iteradores internos. Iteradores externos: recorrido controlado por el cliente Iteradores internos: recorrido controlado por el iterador

  • Patrones de diseo 151

    Iterador Externo

    ListIterator

    first()next()hasNext()item()index()

    Lista

    count()append()remove()

    +list

  • Patrones de diseo 152

    Iterador Externo

    List list = new List();...ListIterator iterator = new ListIterator(list);

    iterator.first();while (!iterator.isDone()) {

    Object item = iterator.currentItem();// cdigo para procesar itemiterator.next();

    }...

  • Patrones de diseo 153

    Iteradores Externos en Java

    interface Iterator {boolean hasNext();Object next();void remove();

    }Iterator it = lista.iterator();while (it.hasNext()) {

    Object item = it.next();// cdigo para procesar item

    }

  • Patrones de diseo 154

    Iterador Externo Polimrfico

    ListaAbstracta

    crearIterador()count()append()remove()

    Lista

    Cliente

    Iterator

    first()next()isDone()CurrentItem()

    ListIterator

  • Iterador Interno

    ListaAbstracta

    count()append()remove()

    Iterator

    doAll()doIf()action()test()

    Lista

    IteradorLista

    action()test()doAll()doIf()

    IteradorConcreto

    action()test()

    Cliente

  • Patrones de diseo 156

    Iterador Interno

    public void doIf() {iterator.first();while (!iterator.isDone()) {

    Object item = iterator.currentItem();if (test(item)) action(item)

    iterator.next();}

    }

  • Patrones de diseo 157

    Iterator

    Consecuencias Simplifica la interfaz de un contenedor al

    extraer los mtodos de recorrido Permite varios recorridos, concurrentes Soporta variantes en las tcnicas de recorrido

  • Patrones de diseo 158

    Mediator

    Propsito Define un objeto que encapsula como interaccionan un

    conjunto de objetos. Favorece un bajo acoplamiento, liberando a los objetos de referenciarse unos a otros explcitamente, y permite variar la interaccin de manera independiente.

    Motivacin Muchas interconexiones entre objetos dificulta la

    reutilizacin y la especializacin del comportamiento. Ventana que incluye un conjunto de elementos grficos

    con dependencias entre ellos.

  • 159

    Motivacin

    ListBox

    getSelection()

    FontDialogDirector

    createWidgets()widgetChanged(Widget)

    +list EntryField

    setText()

    +field

    director.WidgetChanged(this)

    DialogDirector

    showDialog()createWidgets()widgetChanged(Widget)

    Widget

    changed()

    (from Logical View)+director

    Mediator

  • 160

    Mediator

    Motivacin:Cliente :FontDialogDirector :ListBox :EntryField

    showDialog

    widgetChanged

    setText

    getSelection

  • 161

    Estructura

    Mediator

    Colega+mediator

    ColegaConcr1MediatorConcreto ColegaConcr2

    Mediator

  • Patrones de diseo 162

    Mediator

    Aplicabilidad Un conjunto de objetos se comunica entre s de una forma

    bien definida, pero compleja. Las interdependencias son poco estructuradas y difciles de comprender.

    Reutilizar una clase es difcil porque tiene dependencias con muchas otras clases.

    Un comportamiento que es distribuido entre varias clases debera ser adaptable sin crear subclases.

  • Patrones de diseo 163

    Mediator

    Consecuencias Evita crear subclases Desacopla a los colegas. Simplifica los protocolos entre las clases Abstrae el cmo cooperan los objetos Centraliza el control en el mediador: clase difcil de

    mantener

  • Patrones de diseo 164

    Mediator

    Implementacin No hay necesidad de definir una clase abstracta Mediator

    si los colegas trabajan con un nico mediador. Los colegas deben comunicarse con el mediador cuando

    un evento de inters ocurre, varias posibilidades: patrn Observer interfaz de notificacin especializada en Mediator

    (Smalltalk-V): clase ViewManager

  • Patrones de diseo 165

    Memento

    Propsito Captura y exterioriza el estado interno de un objeto, sin

    violar la encapsulacin, de modo que el objeto puede ser restaurado a este estado ms tarde.

    Motivacin Algunas veces es necesario registrar el estado interno de

    un objeto: mecanismos checkpoints y deshacer cambios que permiten probar operaciones o recuperacin de errores.

    Mecanismo de transacciones

  • 166

    Estructura

    Memento

    Creatorestado

    setMemento(Memento)CrearMemento()

    Mementoestado

    getEstado()setEstado()

    Guardian+memento

    return new Memento(estado) estado = m. getEstado

  • 167

    Colaboracin

    Memento

    : Guardian : Creador m : Memento

    1. crearMemento()1.1. new

    1.2. setEstado()

    2. setMemento(m)2.1. getEstado()

  • Patrones de diseo 168

    Memento

    Aplicabilidad Una parte del estado de un objeto debe ser guardado para

    que pueda ser restaurado ms tarde.

    Una interfaz para obtener el estado de un objeto podra romper la encapsulacin exponiendo detalles de implementacin.

  • Patrones de diseo 169

    Memento

    Consecuencias Mantiene la encapsulacin Simplifica la clase Creador ya que no debe preocuparse

    de mantener las versiones del estado interno. Podra incurrir en un considerable gasto de memoria:

    encapsular y restaurar el estado no debe ser costoso. Puede ser difcil en algunos lenguajes asegurar que slo el

    Creador tenga acceso al estado del Memento.

  • Patrones de diseo 170

    Memento

    Implementacin Memento tiene dos interfaces, una para los creadores y

    otra para el resto de clases: clase amiga (C++), exportacin selectiva (Eiffel).

    Un memento puede registrar cambio incremental sobre el estado del creador: cuando se usa el patrn Commandpara el mecanismo undo/redo.

  • Patrones de diseo 171

    Observer / Publish-Subscribe

    Propsito Define una dependencia uno-a-muchos entre objetos, de

    modo que cuando cambia el estado de un objeto, todos sus dependientes automticamente son notificados y actualizados.

    Motivacin Cmo mantener la consistencia entre objetos

    relacionados, sin establecer un acoplamiento fuerte entre sus clases?

    Ejemplo: Separacin Modelo-Vista

  • 0102030405060708090

    1er trim. 2do trim. 3er trim. 4to trim.

    EsteOesteNorte

    1tr3tr

    4tr2tr

    1tr. 2tr. 3tr. 4tr.Este 20 25 90 20Oeste 30 38 32 32Norte 47 47 45 45

    Vistas

    t1=20t2=25t3=90t4=20

    Modelo

    Motivacin

  • 173

    ObserverEstructura

    Observer

    Update()

    Subject

    subjectState

    Attach()Detach()Notify()

    1..*1..1 1..*

    +observers

    1..1

    ConcreteSubject

    subjectState

    getState()setState()

    ConcreteObserver

    observerState

    update()

    +subject

    observerState=subject->getState()

    for all o in observers{o->update()}

  • 174

    Observer

    Colaboracin : Subject o1 : Observer o2 : Observer : Otra

    1. setEstado()

    1.1. notify()1.1.1. update()

    1.1.2. update()

  • Patrones de diseo 175

    Observer

    Aplicabilidad Cuando un cambio de estado en un objeto requiere cambios

    en otros objetos, y no sabe sobre cuntos objetos debe aplicarse el cambio.

    Cuando un objeto debe ser capaz de notificar algo a otros objetos, sin hacer asunciones sobre quines son estos objetos.

  • Patrones de diseo 176

    Observer

    Consecuencias Permite modificar independientemente subjects y

    observers. Acoplamiento abstracto y mnimo entre Subject y

    Observer: puede reutilizarlos por separado observers pueden aadirse sin modificar el subject Subject no necesita conocer las clases concretas de

    Observers

  • Patrones de diseo 177

    Observer

    Consecuencias Soporte para comunicacin de tipo broadcast:

    el subject no especifica al receptor concreto de la notificacin

    es posible aadir y eliminar observers en cualquier instante.

    Actualizaciones inesperadas Interfaz de Observer simple requiere que los

    observers tengan que deducir el item cambiado

  • Patrones de diseo 178

    Observer

    Implementacin Es posible que un observer est ligado a ms de un

    subject: la operacin update tendr como argumento el subject.

    Quin dispara la notificacin? Mtodos set en la clase Subject Clientes de la clase Subject

    Asegurarse de notificar siendo el estado de Subjectconsistente

    Cunta informacin sobre el cambio se le enva a los observers con la notificacin?

    Modelo Push (Mucha) y Modelo Pull (Muy Poca)

  • Patrones de diseo 179

    Observer

    Implementacin Al registrar un observer es posible asociarle el evento

    sobre el que quiere ser notificado

    attach(Observer obs, Evento interes);

    Cuando las relaciones de dependencia entre Subject y Observer son complicadas encapsular la semntica de actualizacin en una clase ManejadorCambio (Mediador).

    En Smalltalk, las interfaces de las clases Subject y Observer se definen en la clase Object.

  • Patrones de diseo 180

    Observer en Javapublic class Observable {

    private boolean changed = false;private Vector obs;public Observable() {

    obs = new Vector();}public synchronized void addObserver (Observer o) {..}public synchronized void deleteObserver (Observer o) {..}public void notifyObservers (Object arg) {..}protected synchronized void setChanged() {..}protected synchronized void clearChanged() {..}public synchronized boolean hasChanged() {.. }

  • Patrones de diseo 181

    Observer en Java

    public interface Observer {void update (Observable o, Object arg);

    }Argumento pasado al

    mtodo notifyObservers, puede indicar el tipo de

    cambio

  • Patrones de diseo 182

    Observer en Java

    Problema Que la clase que deseamos que acte como

    Observable ya herede de otra clase: En Java no hay herencia mltiple!

    Usar delegacin Una clase ConcreteSubject contendr a un objeto de

    una clase que heredar de Observable: implementaaddObserver y deleteObserver e invoca anotifyObservers()

    Se delega el comportamiento que necesita ConcreteSubject al objeto Observable que contiene.

    Por qu una subclase de Observable?

  • Patrones de diseo 183

    Modelo de Eventos de Java 1.1

    Java 1.1 introdujo un nuevo modelo de eventos para GUI basado en el patrn Observer.

    Componentes GUI que pueden generar eventos son llamados fuentes de eventos (event sources).

    Objetos que desean ser notificados de eventos GUI son llamados oyentes de eventos (event listeners).

    Una fuente juega el papel de ConcreteSubject y un listener juega el papel de ConcreteObserver.

    Los listeners deben registrarse en las fuentes.

  • Patrones de diseo 184

    Modelo de Eventos de Java 1.1

    Un listener debe implementar una interfaz que proporciona los mtodos que deben ser llamados por la fuente cuando ocurre el evento.

    Hay 11 interfaces listener cada una apropiada para un diferente tipo de evento GUI: ActionListener, ItemListener, KeyListener,

    MouseListener, WindowListener, ... En algunos casos la interfaz listener incluye ms de

    un mtodo: Java proporciona adaptadores

  • Patrones de diseo 185

    State (Estado)

    Propsito Permite a un objeto cambiar su comportamiento cuando

    cambia su estado. El objeto parece cambiar de clase.

    Motivacin Una conexin TCP puede encontrarse en uno de varios

    estados, y dependiendo del estado responder de un modo diferente a los mensajes de otros objetos para solicitudes tales como abrir, cerrar o establecer conexin.

  • 186

    State

    Motivacin

    TCPEstablished

    open()close()acknowledge()

    TCPListen

    open()close()acknowledge()

    TCPClosed

    open()close()acknowledge()

    TCPState

    open()close()acknowledge()

    TCPConexion

    open()close()acknowledge()

    +state

    state.acknowledge()

  • 187

    State

    Estructura

    StateConcr1

    operacion()

    StateConcr2

    operacion()

    State

    operacion()

    Context

    solicitud()

    +state

    state.operacion()

  • Patrones de diseo 188

    State

    Aplicabilidad El comportamiento del objeto depende de su estado, y debe

    cambiar su comportamiento en tiempo de ejecucin dependiendo de su estado.

    Las operaciones tienen grandes estructuras CASE que dependen del estado del objeto, que es representado por uno o ms constantes de tipo enumerado.

  • Patrones de diseo 189

    State

    Consecuencias Coloca todo el comportamiento asociado a un particular

    estado en una clase. Subclases vs. Sentencias CASE. Ayuda a evitar estados inconsistentes Transiciones de estado son ms explcitas. Incrementa el nmero de objetos Los objetos State pueden ser compartidos.

  • Patrones de diseo 190

    State

    Implementacin Quin define las transiciones entre estados? Context o

    subclases estado. Una alternativa es definir tablas que representan la matriz

    de transiciones de estado: no es posible asociar acciones a los cambios de estado y ms difcil de comprender.

    Cundo son creados los objetos estado? Pueden crearse cuando se necesiten o con antelacin y que Context tenga una referencia a ellos.

  • Patrones de diseo 191

    Strategy/Policy (Estrategia)

    Propsito Define una familia de algoritmos, encapsula cada uno, y

    permite intercambiarlos. Permite variar los algoritmos de forma independiente a los clientes que los usan

    Motivacin Existen muchos algoritmos para justificacin de texto,

    debe implementarlo el cliente que lo necesita?

  • 192

    Strategy

    Motivacin

    JustificacionSimple

    justificar()

    JustificacionTeX

    justificar()

    algoJustif.justificar

    Justificacion

    justificar()

    Composicion

    recorrer()formato()

    +algoJustif

  • 193

    Strategy

    Estructura

    EstrategiaA

    algoritmoInterface()

    EstrategiaB

    algoritmoInterface()

    Estrategia

    algoritmoInterface()

    Contexto

    InterfaceContexto()

    +estrategia

  • Patrones de diseo 194

    Strategy

    Aplicabilidad Configurar una clase con uno de varios comportamientos

    posibles. Se necesitan diferentes variantes de un algoritmo. Una clase define muchos comportamientos que aparecen

    como sentencias CASE en sus mtodos.

  • Patrones de diseo 195

    Strategy

    Consecuencias Define una familia de algoritmos relacionados. Una alternativa a crear subclases de la clase Contexto. Elimina sentencias CASE El cliente puede elegir entre diferentes estrategias o

    implementaciones: debe conocer detalles Se incrementa el nmero de objetos: usar Flyweight State y Strategy son similares, cambia el Propsito:

    ejemplos de composicin con delegacin

  • Patrones de diseo 196

    Strategy

    Implementacin Cmo una estrategia concreta accede a los datos del

    contexto? Pasar datos como argumentos Pasar el contexto como argumento Estrategia almacena una referencia al contexto

  • Patrones de diseo 197

    Template Method (Mtodo Plantilla)

    Propsito Define el esqueleto (esquema, patrn) de un algoritmo en

    una operacin, difiriendo algunos pasos a las subclases. Permite a las subclases redefinir ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo.

    Motivacin Fundamental para escribir cdigo en un framework. Clase Aplicacin que maneja objetos de la clase

    Documento: mtodo OpenDocument

  • Patrones de diseo 198

    Template Method

    void openDocument (String name) {if (! canOpenDocument(nombre){return};Document doc = openDocument();if !(doc = null) {

    docs. addDocument(doc);aboutToOpenDocument (doc);doc.open;doc.read();

    }}

  • Patrones de diseo 199

    Template Method

    has(v:G): Boolean is dofrom start until after or else equal(v,item)loop forth endResult := not after

    end

  • Patrones de diseo 200

    Template Method

    Aplicabilidad Implementar las partes fijas de un algoritmo y dejar que

    las subclases implementen el comportamiento que puede variar.

    Cuando el comportamiento comn entre varias subclases debe ser factorizado y localizado en una superclase comn.

    Controlar extensiones de las subclases: algoritmos con puntos de extensin

  • Patrones de diseo 201

    Template Method Consecuencias

    Tcnica fundamental para la reutilizacin: factorizar comportamiento comn en libreras de clases

    Estructura de control invertida conocida como Principio de Hollywood: No nos llames, nosotros te llamaremos.

    Un mtodo plantilla (template) invoca a los siguientes tipos de mtodos:

    operaciones concretas en la subclase concreta o en clientes operaciones concretas en la clase abstracta operaciones abstractas (primitivas) mtodos factora mtodos hook que proporcionan comportamiento por defecto

  • Patrones de diseo 202

    Template Method

    Implementacin Minimizar el nmero de mtodos que es necesario

    redefinir en las subclases. Nombrar a los mtodos que se deben redefinir

    aadindole cierto prefijo, p.e. do. En C++, mtodos a redefinir son protegidos y virtuales, el

    mtodo plantilla no ser virtual.

  • Patrones de diseo 203

    Visitor

    Propsito Representa una operacin que debe ser aplicada sobre los

    elementos de una estructura de objetos. Permite definir una nueva operacin sin cambiar las clases de los elementos sobre los que opera.

    Motivacin Un compilador que representa los programas como rboles

    de derivacin de la sintaxis abstracta necesita aplicar diferentes operaciones sobre ellos: comprobacin de tipos, generacin de cdigo, listados cdigo fuente, reestructuracin de programas,...

  • 204

    Visitor

    MotivacinNodo

    comprobarTipo()generarCodigo()prettyPrint()

    NodoVariableRef

    comprobarTipo()generarCodigo()prettyPrint()

    NodoAsignacion

    comprobarTipo()generarCodigo()prettyPrint()

  • 205

    Visitor

    Motivacin

    NodoVariableRef

    aceptar(VisitorNodo v)

    NodoAsignacion

    Aceptar(VisitorNodo v)

    Nodo

    aceptar(VisitorNodo v)

    Programa

    v.visitarVariableRef(this) v.visitarAsignacion(this)

  • 206

    Visitor

    MotivacinVisitorNodo

    visitarAsignacion(NodoAsignacion)visitarVariableRef(NodoVariableRef)

    VisitorComprobacionTipos

    visitarAsignacion(NodoAsignacion)visitarVariableRef(NodoVariableRef)

    VisitorGeneracionrCodigo

    visitarAsignacion(NodoAsignacion)visitarVariableRef(NodoVariableRef)

  • Patrones de diseo 207

    Visitor Aplicabilidad

    Tenemos una jerarqua de clases que representan objetos de propsito general (p.e. nodos de un rbol de derivacin de sintaxis) y podemos utilizarlo en diferentes aplicaciones, lo que implicara aadir mtodos en las clases de la jerarqua.

    Una estructura de objetos contiene muchas clases de objetos con diferentes interfaces, y se quiere realizar operaciones sobre los objetos que dependen de las clases concretas.

    Las clases definiendo la estructura de objetos cambian con poca frecuencia, pero a menudo se definen nuevas operaciones sobre la estructura. Mejor definir las operaciones en clases aparte.

  • Patrones de diseo 208

    Visitor

    Consecuencias Facilidad para aadir nuevas operaciones: en vez de

    distribuir la funcionalidad, se aade un nuevo visitor. Un visitor recoge comportamiento relacionado, lo que

    simplifica las clases de los elementos. Es difcil aadir nuevas subclases de elementos concretos,

    ya que implica cambiar la jerarqua de Visitor. A diferencia de un iterador, Visitor puede visitar objetos

    de clases que no tienen una superclase comn. Compromete la encapsulacin: los elementos concretos

    deben permitir a los visitors hacer su trabajo.

  • Patrones de diseo 209

    Visitor

    Implementacin El patrn permite aadir operaciones a clases sin

    cambiarlas. Esto se consigue aplicando la tcnica double-dispatch.

    Quin es responsable del recorrido de la estructura de objetos?

    Estructura de objetos Un iterador El visitor

  • Patrones de diseo 210

    Double-Dispatch

    Point>> + delta^delta isPoint

    ifTrue:[(x+delta x) @ (y + delta y)]ifFalse:[(x+delta) @ (y + delta)]

    Point>> + delta^delta addPoint: self

    Number>> addPoint: aPoint^(self + aPoint x) @ (self + aPoint y)

    Point>> addPoint: aPoint^(self x + aPoint x) @ (self y + aPoint y)

    Patrones de Diseo ContenidosArquitectura software y patronesDiseo orientado a objetosPatronesGranularidadPatrones y frameworksModelo-Vista-ControlModelo-Vista-ControlPlantilla de definicinPlantilla de definicinPlantilla de definicinClasificacinA qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?A qu ayudan los patrones?DelegacinEjercicioA qu ayudan los patrones?Causas comunes de rediseoPatrones frente a esos peligrosCmo seleccionar un patrn?Cmo usar un patrn?Patrones de CreacinPatrones de CreacinEjemplo: LaberintoEjemplo: LaberintoAbstract Factory (Factora Abstracta)Abstract FactoryAbstract FactoryAbstract FactoryAbstract FactoryAbstract FactoryEjemplo: LaberintoBuilder (Constructor)BuilderBuilderBuilderBuilderBuilderEjemplo: LaberintoFactory Method (Mtodo Factora)Factory MethodFactory MethodFactory MethodFactory MethodFactory MethodFactora y MetaclasesEjemplo: LaberintoPrototype (Prototipo)PrototypePrototypePrototypePrototypePrototypeEjemplo: LaberintoFactora Abstracta con PrototipoSingletonSingletonSingletonSingletonSingletonPatrones estructuralesAdapter / Wrapper (Adaptador)Adapter / Wrapper (Adaptador)AdapterAdapterAdapterAdapterAdapterAdapterEjercicioBridge / HandleBridge / HandleBridge / HandleBridge / HandleBridgeBridgeBridgeCompositeCompositeCompositeCompositeCompositeCompositeDecorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Decorator (Decorador)Facade / FachadaFacade / FachadaFacade / FachadaFacade / FachadaFlyweightFlyweightFlyweightFlyweightFlyweightFlyweightFlyweightFlyweightProxyProxyProxyProxyProxyProxyPatrones de comportamientoChain of Responsibility (Cadena de Responsabilidad)Chain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityChain of ResponsibilityRecursion OORecursion OOChain of ResponsibilityCommandCommandCommandCommandCommandCommandCommandCommandCommandInterpreterInterpreterIterator (Iterador)Iterator (Iterador)Iterador ExternoIterador ExternoIteradores Externos en JavaIterador Externo PolimrficoIterador InternoIterador InternoIteratorMediatorMediatorMediatorMediatorMediatorMediatorMediatorMementoMementoMementoMementoObserver / Publish-SubscribeObserverObserverObserverObserverObserverObserverObserverObserver en JavaObserver en JavaObserver en JavaModelo de Eventos de Java 1.1Modelo de Eventos de Java 1.1State (Estado)StateStateStateStateStateStrategy/Policy (Estrategia)StrategyStrategyStrategyStrategyStrategyTemplate Method (Mtodo Plantilla)Template MethodTemplate MethodTemplate MethodTemplate MethodTemplate MethodVisitorVisitorVisitorVisitorVisitorVisitorVisitorDouble-Dispatch