Você está na página 1de 41

Ingeniera del Software I

Patrones de Diseo

Patrones de Diseo
EJERCICIOS Ingeniera del Software I

Carlos Blanco Universidad de Cantabria

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.

Son un esqueleto bsico que cada diseador adapta a las

peculiaridades de su aplicacin.

Ingeniera del Software I

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

Ingeniera del Software I

Patrones de Diseo

Clasificacin

Ingeniera del Software I

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

Ingeniera del Software I

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

Ingeniera del Software I

Patrones de Diseo

Diagrama de clases para el conjunto de productos:

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 ?

Ingeniera del Software I

Patrones de Diseo

Fbrica Abstracta
ABSTRACT FACTORY

Especifica como crear familias de objetos que guardan cierta

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.

Conseguimos que el sistema sea independiente de cmo se crean, componen o

representan las entidades representadas. Los sistemas se vuelven fcilmente extensibles.

Ingeniera del Software I

Patrones de Diseo

Fbrica Abstracta
ABSTRACT FACTORY

La fbrica abstracta tiene operaciones abstractas

(por cada producto)


Tenemos tantos tipos de fbricas concretas

como de productos.
Cada fbrica concreta conoce a los productos

que puede fabricar.


[ para simplificar slo estn indicadas las relaciones de FabricaJoven ]

Ingeniera del Software I

Patrones de Diseo

Fbrica Abstracta
ABSTRACT FACTORY

La creacin de la familia de productos podra residir en el

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.

Ingeniera del Software I

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).

Ingeniera del Software I

Patrones de Diseo

Constructor
BUILDER

Ingeniera del Software I

Patrones de Diseo

Constructor
BUILDER

En la figura anterior, la clase Cuenta hace las veces de constructor

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:

Ingeniera del Software I

Patrones de Diseo

Constructor
BUILDER

Cada constructor concreto (clases CuentaJoven, Cuenta10,

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:

Ingeniera del Software I

Patrones de Diseo

Problema
Queremos hacer un agente de base de datos (o Broker) en el que se

centralice el acceso a la BBDD.

Queremos asegurarnos de que existe una nica instancia de ese

agente, para que todos los objetos que la usen estn tratando con la misma instancia, accedan a ella de la misma forma,...

Usar una variable global no garantizara que slo se instancie una

vez

Ingeniera del Software I

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)

INSTANCIA ESTTICA CONSTRUCTOR PROTEGIDO

OPERACIN DE ACCESO ESTTICA OPERACIONES DE LA CLASE

Ingeniera del Software I

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.

Ingeniera del Software I

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

Ingeniera del Software I

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 )

Qu podramos hacer para que nuestras instancias de

Tarjeta y Cuenta respondan adecuadamente a los nuevos cajeros ?

Ingeniera del Software I

Patrones de Diseo

Problema
Solucin: Modificar el cdigo de Tarjeta (y de Cuenta), aadiendo un nuevo mtodo ... solucin poco elegante

Ingeniera del Software I

Patrones de Diseo

Adaptador
ADAPTER

Solucin: Utilizar el patrn Adaptador (mucho ms elegante y no hay que tocar el cdigo de la clase)

Ingeniera del Software I

Patrones de Diseo

Adaptador
ADAPTER

El Adaptador podra ser una clase abstracta que sera instaciada

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)

Ingeniera del Software I

3.02

Patrones de Diseo

Patrn Composite (Compuesto)

En ocasiones, un objeto est formado por objetos que, a su vez, poseen en

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,...

Cmo podramos modelar esto?

Ingeniera del Software I

Patrones de Diseo

Compuesto
COMPOSITE

Las dos subclases implementan las operaciones abstractas definidas

en Componente En el ejemplo ObjetoSimple sera abstracta y heredaran rectngulo, elipse,...

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.

Ingeniera del Software I

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?

Ingeniera del Software I

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)

Ta rjetaC red ito 10 (f rom dominio)

Otro
(fr om Us e Case View)

+ retirar() + ingresar() + pagar()

Ta rjetaC red itoOro (f r om d om inio )

TarjetaDebito10 (f rom dominio)

TarjetaDe bito
(from dominio)

TarjetaDebitoEstandar (f rom dominio)

+ retirar() + ingresar() + pagar()

TarjetaDebitoOro (f rom dominio)

TarjetaDebitoJov en (f rom dominio)

Ingeniera del Software I

Patrones de Diseo

Problema
Diseo de un tablero de ajedrez Sabemos que hay distintos tipos de piezas Y que cada jugador tiene:

8 peones, 2 torres, 2 caballos, 2 alfiles, 1 reina, 1 rey.

Cmo podramos modelar el tablero y las piezas?

Ingeniera del Software I

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?

Ingeniera del Software I

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

Ingeniera del Software I

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)

Ingeniera del Software I

Patrones de Diseo

Decorador
DECORATOR

Ingeniera del Software I

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)

+ retirar ( importe : float )

Queremos delegar el comportamiento de la operacin retirar,

cmo lo haramos?

Ingeniera del Software I

Patrones de Diseo

Estado
STATE
Cuenta
# # # # mPKEnti dad : String mPKSucursal : String mPKDC : String mPKCCC : String

Apuntes de Ingeniera del Software II

#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

Ingeniera del Software I

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

que se pueda ejecutar la operacin ayuda() en cualquier objeto.

Si el objeto es capaz de hacerse cargo de la operacin, la ejecutar, y

si no la pasar a otro (sucesor) hasta que alguien se haga cargo del mensaje.

Cmo podramos modelarlo?

Ingeniera del Software I

Patrones de Diseo

Cadena de Responsabilidad
CHAIN OF RESPONSIBILITY

Ingeniera del Software I

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.

sin incluye la operacin abstracta interpretar(Contexto), que es redefinida en c

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

Aplicando el patrn Intrprete y un poco de heurstica, podemos obtener la te jerarqua de clases:


Cmo podramos modelarlo?

Ingeniera del Software I

Patrones de Diseo

Intrprete
INTERPRETER

Representa el rbol sintctico de la expresin a analizar.

Los terminales se convierten tambin en clases

Una clase por cada una de las reglas

Ingeniera del Software I

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.

Ingeniera del Software I

Patrones de Diseo

Estrategia
STRATEGY

Ingeniera del Software I

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.

Ingeniera del Software I

Patrones de Diseo

Solucin

Você também pode gostar