Escolar Documentos
Profissional Documentos
Cultura Documentos
Patrones de Diseo
Patrones de Diseo
EJERCICIOS Ingeniera del Software I
Patrones de Diseo
Introduccin
Un patrn es una solucin probada que se puede aplicar
con xito a un determinado tipo de problemas que aparecen repetidamente en algn campo Propuestos por el Gang of Four (Gamma, Helm, Johnson y Vlissides).
Design Patterns. Elements of Reusable Object-Oriented Software - Erich Gamma,
Richard Helm, Ralph Johnson, John Vlissides - Addison Wesley (GoF- Gang of Four). Addison Wesley. 1994.
peculiaridades de su aplicacin.
Patrones de Diseo
Introduccin
Establece el aspecto de diseo a ser resuelto
Resuelve el problema
Problema
Solucin
Contexto
Circunstancias bajo las cuales se establece el problema y debe ser aplicable la solucin
Patrones de Diseo
Clasificacin
Patrones de Diseo
Problema
En un sistema bancario existen diferentes familias de
productos con caractersticas distintas. Estn asociados a varios tipos de cuenta que dependen del tipo de cliente que las abra:
Cuenta Joven, para clientes < 25 aos Cuenta 10, para clientes entre 26 y 65 aos y con nmina
domiciliada Cuenta Oro, para mayores de 65 aos con pensin Cuenta Estndar, para clientes que no encajan en las anteriores
Patrones de Diseo
Problema
Las caractersticas de los productos se resumen en la siguiente tabla:
Tal y como se ve, aunque puede parecer que se ofrecen siempre los
mismos productos, existen ciertas particularidades entre ellos que hacen que sean distintos, ciertas caractersticas que hacen que se construyan de manera distinta. Representar el conjunto de productos mediante un diagrama de clases
Patrones de Diseo
Podramos crear uno a uno los elementos correspondientes a cada uno de los tipos de
cuenta... pero no es elegante Nos gustara tener la opcin de que al crear una cierta cuenta se crearan automticamente los productos asociados al tipo de cuenta Cmo podramos hacerlo ?
Patrones de Diseo
Fbrica Abstracta
ABSTRACT FACTORY
relacin entre s.
Nosotros tan slo tenemos que utilizar las interfaces que se nos
proponen para interactuar con el sistema, sin importar el tipo de elemento a instancias, ya que la fbrica lo har por nosotros.
Se generaliza el comportamiento de una familia de clases.
Patrones de Diseo
Fbrica Abstracta
ABSTRACT FACTORY
como de productos.
Cada fbrica concreta conoce a los productos
Patrones de Diseo
Fbrica Abstracta
ABSTRACT FACTORY
siguiente mtodo
En este cdigo existe un objeto f de tipo Fabrica (que es una clase abstracta); Dependiendo del tipo de cliente, f se instancia al tipo de fbrica correspondiente. A continuacin, se ejecutan las cuatro operaciones de creacin del lote de productos.
Estas operaciones son abstractas en Fabrica, pero concretas en sus subclases. Puesto que, al llegar a la sentencia f.crearCuenta() la variable f ya est instanciada a una fbrica concreta, se ejecuta la versin adecuada de la operacin.
Patrones de Diseo
Problema
Siguiendo con el ejemplo anterior... Queremos construir objetos complejos que pueden ser de distinto
tipo (los tipos de cuenta). Utilizando para ello otros objetos y una secuencia de pasos definida (crear el tipo de tarjeta, regalos, etc.).
Ahora nos interesara: Asegurarnos que se utiliza siempre el mismo proceso (la misma
secuencia de pasos) para crear una cuenta de un determinado tipo o un lote formado por varias cuentas,... La idea es buscar un desacople de las funciones del constructor (la clase Cuenta de la Fbrica Abstracta).
Patrones de Diseo
Constructor
BUILDER
Patrones de Diseo
Constructor
BUILDER
abstracto (de Builder abstracto). Obsrvese tambin que hemos aadido una nueva clase (Director), que es la encargada de llamar al constructor, una vez instanciado. Con esta estructura, la creacin de la familia de productos podra residir en el siguiente mtodo:
Patrones de Diseo
Constructor
BUILDER
CuentaOro y CuentaEstandar) es el responsable de crear los objetos correspondientes, lo cual se hace en el mtodo abrir(), que recibe diferentes implementaciones en cada clase Ejemplo:
Patrones de Diseo
Problema
Queremos hacer un agente de base de datos (o Broker) en el que se
agente, para que todos los objetos que la usen estn tratando con la misma instancia, accedan a ella de la misma forma,...
vez
Patrones de Diseo
Singleton
Los clientes acceden a la nica instancia mediante la operacin
getAgente() Esta operacin es tambin responsable de su creacin (si existe nos da la instancia y si no existe, la crea)
Patrones de Diseo
Problema
Se est desarrollando un juego que permite al usuario interactuar
con personajes que juegan ciertos roles. Se desea incorporar al juego una facilidad para crear nuevos personajes que se aaden al conjunto de personajes predefinidos. En el juego, todos los personajes sern instancias de un pequeo conjunto de clases tales como Heroe, Villano, Principe o Monstruo. Cada clase tiene una serie de atributos como nombre, imagen, altura, peso, inteligencia, habilidades, etc. y segn sus valores, una instancia de la clase representa a un personaje u otro, por ejemplo podemos tener los personajes prncipe bobo o un prncipe listo, o monstruo bueno o monstruo malo. Disea una solucin que permita al usuario crear nuevos personajes y seleccionar para cada sesin del juego personajes de una coleccin de personajes creados.
Patrones de Diseo
Prototipo
PROTOTYPE
Se utiliza el patrn Prototype para mantener un catlogo de instancias prototpicas que se crean a partir de los personajes predefinidos. El catlogo puede implementarse como un singleton.
Monstruo
Patrones de Diseo
Problema
Supongamos que en nuestro sistema bancario... La clase Tarjeta tiene un mtodo transferir ( float importe, String cuentaDestino ) La clase Cuenta tiene un mtodo transferir ( float importe, String cuentaDestino ) El banco ha adquirido un modelo novedoso de cajeros automticos
que permiten hacer transferencias, pero la interfaz esperada para esta operacin es: order ( String target, float amount )
Patrones de Diseo
Problema
Solucin: Modificar el cdigo de Tarjeta (y de Cuenta), aadiendo un nuevo mtodo ... solucin poco elegante
Patrones de Diseo
Adaptador
ADAPTER
Solucin: Utilizar el patrn Adaptador (mucho ms elegante y no hay que tocar el cdigo de la clase)
Patrones de Diseo
Adaptador
ADAPTER
Apuntes de Ingeniera del Software II segn el caso. (hacemos del adaptador una fbrica abstracta).
Adaptador
+ order(target : String, amount : Float) Cajero
(from Use Case View)
AdaptadorDeTarjeta
Tarjeta
# mPKNumero : String + transferi r(importe : Float, cuentaDestino : String)
Cuenta
(f rom dominio)
AdaptadorDeCuenta
# # # # + + + + +
mPKEntidad : String mPKSucursal : String mPKDC : String mPKCCC : String abrir() llegaRecibo() ingresar() retirar() transferi r(importe : Float, cuentaDestino : String)
3.02
Patrones de Diseo
Problema Word, por ejemplo, es posible agrupar varios objetos de dibujo en un grupo; e
po se maneja como un nico objeto, y puede ser tambin agrupado junto a otros
ior objetos que son de la clase del objeto original. En el procesador de textos M
Objetos de dibujo en un de texto . de forma que procesador un grupo puede contener, mezclados, objetos simples y grupos. La
Los objetos se pueden agrupar en un grupo que se maneja como creamos un grupo a partir de dos objetos, lo que se muestra en el lado derech
132(a) muestra cuatro objetos sencillos dibujados con Word; en el lado izquierd
un nico objeto. lado izquierdo de (c),agrupar creamos un nuevo grupo formado de porforma el grupo creado a Ese grupo a su vez se puede con otros objetos, mente y un nuevo objeto simple, cuyo resultado grupos, se muestra a la derecha. que cada grupo puede contener objetos simples, mezclados,...
Patrones de Diseo
Compuesto
COMPOSITE
Clase que representa al objeto susceptible de ser compuesto. Las operaciones son abstractas, dependern de que el Componente sea simple o compuesto.
Implementarn las operaciones, bien para una instancia, bien para gestionar un objeto compuesto.
Patrones de Diseo
Problema
Volviendo al sistema bancario... Supongamos que deseamos dotar a los desarrolladores de la capa
de presentacin de un mecanismo unificado de acceso a la capa de dominio Queremos ofrecer las siguientes operaciones pblicas: transferir(), sacarDinero(), y consultarSaldo() Cmo podramos modelar esto?
Patrones de Diseo
CuentaEstandar (f rom dominio)
Fachada
FACADE
+ + + + +
Cuenta
(f rom dominio) abrir() llegaRecibo() ingresar() retirar() transf erir(importe : Float, cuentaDestino : String)
CuentaOro
(from dominio)
Cuen ta10
(from dominio)
CuentaJov en
(from dominio)
Fachada
+ transf erir() + sacarDinero() + consultarSaldo() TarjetaCredito
(from dominio)
Otro
(fr om Us e Case View)
TarjetaDe bito
(from dominio)
Patrones de Diseo
Problema
Diseo de un tablero de ajedrez Sabemos que hay distintos tipos de piezas Y que cada jugador tiene:
Patrones de Diseo
Problema
! La operacin mover tan slo necesita la posicin destino, ya que la ficha conoce al tablero en el que esta ubicada.
La solucin esta bienpero son 32 instancias por partida. Si suponemos que vamos a usar un servidor con mltiples partidas Cmo podramos modelarlo para disminuir el nmero de objetos en
memoria?
Patrones de Diseo
Peso Mosca
FLYWEIGHT
PesoMosca
PesoMosca Concreto
El tablero conoce slo a 1 instancia de cada tipo de pieza. Pasamos de 32 instancias por partida a 6 (1 por pieza), o incluso a 6 para
todas las partidas. Estado intrnseco: pertenencia a un tipo de pieza y conocimiento del tablero al que pertenece. Estado extrnseco: ahora a mover() le pasamos tambin el origen y color de la pieza.
Con esto conseguimos menos memoria pero a cambio de tiempo de cmputo
Patrones de Diseo
Problema
Se proporciona una clase TextView que representa un
componente GUI ventana de texto. La clase TextView tiene un mtodo dibujar entre otros. TextView es subclase de Component , que es la raz de la jerarqua de clases que representan componentes GUI.
Queremos definir ventanas de texto con: diferentes tipos de bordes (Plain, 3D, Fancy) y barras de desplazamiento (horizontal, vertical)
Patrones de Diseo
Decorador
DECORATOR
Patrones de Diseo
Problema
Sistema bancario
Nos centramos en la clase Cuenta Sabemos que una parte importante del comportamiento de este
objeto para la operacin retirar(float importe) depende del estado de la cuenta, que puede ser:
Cuenta ConDinero Cuenta SinDinero Cuenta BloqueadaJudicialmente
Cuenta
# # # # mPKEnti dad : String mPKSucursal : String mPKDC : String mPKCCC : String
+ saca rDinero (importe : float ) + transfe rir(i m porte : flo at, cuentaDestino : Cuenta)
cmo lo haramos?
Patrones de Diseo
Estado
STATE
Cuenta
# # # # mPKEnti dad : String mPKSucursal : String mPKDC : String mPKCCC : String
#mEstado
EstadoCuenta
+ retirar(importe : float)
+ saca rDinero (importe : float ) + transfe rir(i m porte : flo at, cuentaDestino : Cuenta)
ConDinero
SinDinero
BloquedaJudicialmente
! De esta manera, agregar nuevos estados y modificar los existentes es muy sencillo. ! En ningn caso habra que tocar el cdigo de la clase Cuenta.
IMarcadorDe Telefono
Patrones de Diseo
Problema
Gestor de ayuda
Tenemos varias clases Boton, Pantalla y Aplicacion. Cada una con un mtodo ayuda(). Queremos desacoplar al emisor de un mensaje del receptor, de forma
si no la pasar a otro (sucesor) hasta que alguien se haga cargo del mensaje.
Patrones de Diseo
Cadena de Responsabilidad
CHAIN OF RESPONSIBILITY
iremos instanciando clases que procesan los diferentes elementos del lenguaje Patrones de Diseo de sus especializaciones.
Procesamiento de un lenguaje sencillo lado derecho se representan como propiedades de cada una de las clases.
Problema
De forma general, se usa una clase por cada regla de la gramtica. Los smb
sistema bancario bancario, es es posible posible realizar realizar Supongamos Supongamosque, que en en el sistema
algunas operaciones sobre las cuentas con un lenguaje de
algunas ope
sobre las cuentas con un lenguaje dedado comandos que viene dado por la s comandos sencillo, que viene por la sencillo, siguiente gramtica: gramtica:
operacin retirada ingreso transferencia : : : : retirada | ingreso | transferencia retirar CANTIDAD CUENTA ingresar CANTIDAD CUENTA transferir CANTIDAD CUENTA CUENTA CONCEPTO
Patrones de Diseo
Intrprete
INTERPRETER
Patrones de Diseo
Problema
Se est construyendo una librera de clases para representar
componentes GUI. Se ha decidido que en vez de que un programador defina la posicin de los componentes GUI (Button, List, Dialog,..) sobre una ventana, se incluyan manejadores de disposicin de componentes (layout manager). Cada uno distribuye un conjunto dado de componentes grficos de acuerdo a algn esquema de distribucin: horizontalmente, verticalmente, en varias filas, en forma de una matriz, etc. Debe ser posible cambiar en tiempo de ejecucin la distribucin elegida inicialmente. Supuesto que la clase JPanel es la que representa a un contenedor de componentes grficos, disea una solucin para introducir en la librera los manejadores de disposicin. Dibuja el diagrama de clases que refleje la solucin.
Patrones de Diseo
Estrategia
STRATEGY
Patrones de Diseo
Problema
La librera Swing de Java incluye la clase JList para presentar una lista
de objetos (el texto que se visualiza es determinado por el mtodo toString de la clase de los objetos) y permitir al usuario seleccionar uno de ellos. El diseo de esta clase es un ejemplo de utilizacin del patrn Adaptador para conseguir una clase reutilizable; se consigue que JList sea independiente de la fuente (o modelo) de datos. Muestra mediante un diagrama de clases el diseo que permitira a una clase como JList visualizar diferentes listas de items, como por ejemplo un catlogo de clientes (por ejemplo, se mostrara su NIF) o un catlogo de cuentas (por ejemplo, se mostrara el cdigo de cuenta). Para cada clase o interfaz del diagrama indica los mtodos y atributos que son significativos. Ntese que la clase JList necesita disponer de informacin como el nmero de tems a visualizar y el objeto seleccionado. Los adaptadores almacenan la lista que se visualiza como una instancia de Vector.
Patrones de Diseo
Solucin