You are on page 1of 103

Patrones de Diseo

con ejercicios en Java

micael.gallego@gmail.com

Qu es un patrn de diseo?

Es una solucin bien documentada que los


expertos aplican para solucionar nuevos problemas
porque han sido utilizadas con xito en el pasado
Los expertos identifican partes de un problema que
son similares a otros problemas que han
encontrado anteriormente
Recuerdan la solucin aplicada y la generalizan
Adaptan la solucin general al contexto del
problema actual

Qu es un patrn de diseo?

Son una forma estandarizada para representar


soluciones generales de problemas que se
encuentran comnmente en el desarrollo de
software orientado a objetos
Beneficios

Catlogos de patrones
Estn documentados los pros y los contras de cada patrn.
Se conocen las implicaciones de su aplicacin
Proporcionan un vocabulario comn entre desarrolladores

Abstraccin y Reutilizacin
Los

patrones suponen una evolucin en la


abstraccin y reutilizacin en la
programacin
Abstraccin

Resolucin de problemas complejos dividindolos


en otros ms simples
Capacidad de ocultar detalles superfluos y
centrarse en lo relevante para reducir la
complejidad

Abstraccin y Reutilizacin
Reutilizacin

Posibilidad de usar de nuevo cdigo ya


desarrollado anteriormente
Formas de reutilizacin

Copiar y Pegar !!PELIGRO


Reutilizacin de algoritmos (bsquedas,
ordenaciones, )
Reutilizacin de funciones (mtodos)
Reutilizacin de libreras o APIs (mtodos, clases, )

Abstraccin y Reutilizacin
Abstraccin

y Reutilizacin en Programacin
Orientada a Objetos

Abstraccin funcional y de datos


La encapsulacin implica mejor reutilizacin
La herencia permite formas de reutilizacin antes
no posibles

Es posible desarrollar algoritmos de forma genrica y


especializarlos creando clases hijas y redefiniendo o
implementando ciertos mtodos

Abstraccin y Reutilizacin
Tipo de Reutilizacin Se puede aplicar
de nuevo?

Qu se abstrae?

Genericidad

Fragmento de
cdigo

Muy Pobre

Nada

Muy pobre

Estructura de datos

Buena

Tipos de datos

Moderada-Buena

Funcional

Buena

Mtodo

Moderada-Buena

Tipos Genricos

Buena

Operacin para tipo

Buena

Algoritmo

Buena

Frmula

Buena

Clases (Interfaz,
Polimorfismo, Clase
abstracta)

Buena

Datos + Mtodos

Buena

API (Librera)

Buena

Clases tiles

Buena-Muy Buena

Componente

Buena

Grupo de Clases

Buena-Muy Buena

Patrn de Diseo

Excelente

Solucin a un
problema

Muy Buena

Tipos de Patrones
Existen

cuatro grandes tipos de patrones de

diseo

Patrones de Creacin
Patrones de Comportamiento
Patrones Estructurales
Patrones de sistema

Tipos de Patrones
Patrones

Facilitan y simplifican la creacin de objetos


Permiten crear objetos sin definir la clase
concreta, slo la interfaz que debe implementar
Permiten reutilizar otros objetos en vez de crear
nuevos debido a restricciones o eficiencia

Patrones

de Creacin

de Comportamiento

Guan el flujo de control del sistema (para facilitar


la eficiencia y facilitar el mantenimiento)

Tipos de Patrones
Patrones

Describen formas efectivas de partir y combinar


los elementos de una aplicacin
Permiten la comunicacin de sistemas
incompatibles, la introduccin de simplificaciones
que mejoren la independencia entre partes,

Patrones

Estructurales

de sistema

Se aplican a la arquitectura de la aplicacin


Patrones ms generales que los otros tipos

Cmo es un patrn?

Los patrones estn especificados siguiendo un


formulario o formato estndar:

Nombre
Tambin conocido como Otros nombres usuales
Propiedades
Tipo - Creacin, Comportamiento, Estructural o De sistema
Nivel - Clase nica, Componente (Grupo de clases),
Arquitectnico (Coordina sistemas y subsistemas)
Propsito - Para qu sirve?
Presentacin Problema que soluciona (con ejemplos)
Aplicabilidad Cuando y por qu debera usarse

Cmo es un patrn?

Descripcin Que hace y como se comporta de


forma detallada
Implementacin - Cmo implementarlo?
Ventajas e Inconvenientes
Variantes
Patrones Relacionados
Ejemplo

Patrones de Creacin
Facilitan

y simplifican la creacin de objetos


Permiten crear objetos sin definir la clase
concreta, slo el interfaz que debe
implementar
Permiten reutilizar otros objetos en vez de
crear nuevos debido a restricciones o
eficiencia

Patrones de Creacin
Singleton

Restringe la creacin de un nico objeto de una


clase en todo el sistema y permite acceder a l

Factory

Method (Mtodo Factora)

Define un mtodo para la creacin de objetos


adems del constructor

Builder

(nico)

(Constructor)

Simplifica la construccin de objetos complejos


definiendo una clase cuya responsabilidad es
crear objetos de otras clases

Patrones de Creacin
Abstract

Factory (Fbrica Abstracta)

Permite crear objetos de un conjunto de clases


relacionadas pero sin especificar la clase
concreta, solo el interfaz

Prototype

(Prototipo)

Define clases cuyos objetos pueden clonarse

Hay

muchos mas

Patrones de Creacin

Singleton (nico)
Propiedades

Tipo: Creacin, Nivel: Objeto

Propsito

Permite tener una nica instancia de esta clase


en el sistema, y permite que todas las clases
tengan acceso a esa instancia

Patrones de Creacin

Singleton (nico)

Introduccin

Hay veces que se necesita esta funcionalidad


Por ejemplo: Un histrico de todas las acciones que realiza
el usuario en la aplicacin. Desde todas las clases se
necesita usar el mismo objeto HistoryList
Se podra crear un nico objeto y pasar ese objeto como
parmetro a todos los dems objetos. Puede no saberse a
priori quien va a necesitar el objeto y puede ser complejo
estar pasndolo constantemente. Slo con documentacin
se puede obligar a que nadie ms cree un objeto
HistoryList

Patrones de Creacin

Singleton (nico)
Introduccin

Se podra crear el objeto al inicio y colocarlo en


un atributo esttico. Pero no se podra
proporcionar ninguna informacin de inicializacin
justo cuando vaya a usarse y no se puede
controlar quien accede al objeto

Patrones de Creacin

Singleton (nico)

Aplicabilidad

Cuando se requiera una instancia de una clase y accesible


globalmente

Descripcin

Asegura crear como mximo una instancia de un objeto.


Ponga el constructor privado
Ponga un mtodo pblico esttico getInstance() que
devuelva el objeto. Este mtodo crea la instancia si no se
ha creado todava, la guarda como un atributo esttico
privado y la devuelve
Se puede crear el objeto directamente sobre el atributo
esttico

Patrones de Creacin

Singleton (nico)

Implementacin

Clase que tiene privado el


constructor, mantiene una
referencia esttica al nico
objeto de la clase y
proporciona un mtodo
esttico getInstance()
para que otras clases accedan
al nico objeto
El resto de la implementacin
es completamente normal

Patrones de Creacin

Singleton (nico)
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class HistoryList {
private static HistoryList instance = new HistoryList();
private List history = new ArrayList();
private HistoryList() {
}
public static HistoryList getInstance() {
return instance;
}
public void addCommand(String command) {
history.add(command);
}
public Object undoCommand() {
return history.remove(history.size() - 1);
}
}

...

Patrones de Creacin

Singleton (nico)

Ventajas

La clase Singleton es la nica que puede crear objetos de


la clase, asegurando la unicidad
No se necesita pasar la referencia a todos los objetos que
la necesiten, simplificando el desarrollo y haciendo la
aplicacin ms mantenible

Inconvenientes

Puede tener problemas en aplicaciones con muchos hilos


de ejecucin y con una nica instancia
Si en el sistema evoluciona y se necesitan ms instancias
de la clase, habra que cambiar todos los accesos a la
clase Singleton

Patrones de Creacin

Singleton (nico)
Variaciones

del patrn

Mantener varias instancias que pueden ser


obtenidas con versiones con parmetros del
mtodo getInstance(...)
Cuando existen mltiples instancias, pueden ser
de clases hijas diferentes dependiendo de los
parmetros

Patrones de Creacin

Singleton (nico)
Patrones

relacionados

Abstract Factory (Factora Abstracta)


Builder (Constructor)
Prototype (Prototipo)

Patrones de Creacin

Singleton (nico)

Patrn Singleton en la API de Java

Clase java.awt.Toolkit
Variacin del patrn porque Toolkit es abstracta y la
instancia devuelta es de una clase hija
El mtodo es getDefaultToolkit()
Clase java.lang.Runtime
El mtodo es getRuntime()
Clase java.text.DateFormat
Variacin del patrn porque DateFormat es abstracta
Tiene varios mtodos con varias instancias
getDateInstance(), getDateInstance(int
style), getDateTimeInstance(),

Ejercicio 1
Aplica

el patrn Singleton a la clase


GestorIO en el juego de las Tres en Raya
De esta forma se conseguir eficiencia,
porque con un objeto GestorIO es
suficiente en toda la aplicacin

Patrones de Creacin

Prototype (Prototipo)
Propiedades

Tipo: De creacin, Nivel: Clase nica

Propsito

Facilita la creacin de objetos copia de otros


objetos

Patrones de Creacin

Prototype (Prototipo)
Introduccin

En muchas ocasiones es necesario crear objetos


que tengan el mismo estado que otros objetos ya
creados
Se podra crear un objeto en su estado inicial y
copiar el valor de cada atributo. Pero eso
obligara a desencapsular la clase
El patrn consiste en crear un mtodo copy que
cree un objeto con el mismo estado que el que
recibe el mensaje de copy

Patrones de Creacin

Prototype (Prototipo)
Aplicabilidad

Se utiliza el patrn Prototype para crear un objeto


que sea copia de otro

Descripcin

Permite copiar el estado de un objeto


Se puede utilizar en las opciones de copiar y
pegar

Patrones de Creacin

Prototype (Prototipo)
Implementacin

Incluir un mtodo de copia (copy)


Este mtodo devuelve un objeto de la misma
clase cuyos atributos tienen los mismos valores
que los atributos del objeto original

Ventajas

e Inconvenientes

Crea copias sin necesidad de que el que necesita


la copia conozca todos los atributos de lo copiado
Hay que tener en cuenta la profundidad de la
copia (copiar la referencia de un atributo o copiar
el atributo en s)

Patrones de Creacin

Prototype (Prototipo)
Variaciones

Constructor de copia, que recibe como parmetro


un objeto de la misma clase y obtiene de l sus
valores

Patrones

del patrn

relacionados

Abstract Factory (Factora Abstracta)


Factory Method (Mtodo de Fabricacin)

Patrones de Creacin

Prototype (Prototipo)
Ejemplo

Ejercicio 2
Aplica

el patrn Prototype en la clase Lista


del ejemplo de las estructuras de datos para
copiar la lista
Que se copie la lista, pero no los elementos
que contiene
Crea un programa ejemplo para comprobar
el correcto funcionamiento del cdigo

Patrones de Creacin

Factory Method (Mtodo Factora)


Tambin

conocido como

Virtual Builder (Constructor Virtual)

Propiedades

Tipo: De creacin, Nivel: Clase

Propsito

Permite definir un mtodo estndar en una clase


para crear objetos. Las subclases deciden la
clase concreta que crear

Patrones de Creacin

Factory Method (Mtodo Factora)


Introduccin

Supongamos una aplicacin de gestin de una


lista, que permita borrar, editar y aadir valores

Esta aplicacin tiene dos partes, la interfaz de


usuario (un men en modo texto) y la Lista.

La lista tiene un mtodo para poner un valor


(String) en una determinada posicin (int)

public void set(int position, String value)

Patrones de Creacin

Factory Method (Mtodo Factora)

Se quiere generalizar la aplicacin incorporando


una estructura de datos tipo mapa (clave,valor)
Creamos la clase abstracta EstructuraDatos
(de la que heredan Lista y Mapa). Creamos la
clase abstracta Selector (de la que heredan
SLista y SMapa)
El men usa objetos de EstructuraDatos y
Selector.
De esta forma se pueden incorporar nuevas
estructuras de datos

Patrones de Creacin

Factory Method (Mtodo Factora)

El problema est en que el men tiene que


construir objetos de la clase Selector cuando le
pregunta al usuario, pero no sabe que clase
instanciar, si SLista o SMapa.
El patrn Mtodo Factora propone que exista un
mtodo en EstructuraDatos que permita crear
el objeto Selector correspondiente
(Ver ejemplo)

Patrones de Creacin

Factory Method (Mtodo Factora)


Ejemplo

(ver cdigo)

Patrones de Creacin

Factory Method (Mtodo Factora)


Aplicabilidad

Cuando se quiera crear un framework extensible.


Cuando una subclase decide que objeto crear
Sabe cuando crear un objeto, pero su clase
depende de la clase de otro objeto

Patrones de Creacin

Factory Method (Mtodo Factora)


Descripcin

Existe un mtodo de fabricacin en una clase


abstracta (Creator) que debe ser implementado
por las clases hijas (ConcreteCreator).
Ese mtodo devuelve objetos que heredan de
una clase abstracta (Product)
Son las ConcreteCreator las que deciden la
clase que hereda de Product
(CocreteProduct) que deben instanciar

Patrones de Creacin

Factory Method (Mtodo Factora)


Implementacin

Patrones de Creacin

Factory Method (Mtodo Factora)


Ventajas

e Inconvenientes

Con el polimorfismo podemos hacer cdigo


genrico para una clase. Con este patrn
podemos hacer cdigo genrico para varias
clases y el cdigo genrico puede instanciar
objetos cuando quiere
El inconveniente es que para aadir un producto
nuevo hay que cambiar varias clases

Patrones de Creacin

Factory Method (Mtodo Factora)


Variaciones

Creator puede tener factoryMethod concreto


y proporcionar una implementacin por defecto
El mtodo de fabricacin puede tomar parmetros
y puede instanciar los ConcreteProduct
dependiendo del parmetro
Creator y Product pueden ser interfaces

Patrones

del Patrn

relacionados

Abstract Factory (Fbrica Abstracta)


Prototype (Prototipo)
Template Method (Mtodo Plantilla)

Ejercicio 3
Incorpora

una nueva implementacin del


Tablero del juego de las Tres en Raya.
Las columnas deben identificarse mediante
letras (A,B,C)
Habr que crear otra implementacin de
Coordenada con las columnas como letras
Usar el patrn Factory Method al instanciar
objetos de alguna clase concreta de
coordenada

Patrones de Comportamiento
Estn

relacionados con el flujo de control del


sistema
Ciertas formas de organizar el control en un
sistema pueden derivar en grandes
beneficios para la eficiencia y el
mantenimiento del sistema

Patrones de Comportamiento

Chain of Responsability (Cadena de


Responsabilidad)

Command (Comando)

Establece una cadena en un sistema, para que un


mensaje pueda ser manejado en el nivel en el que se
recibe en primer lugar o ser redirigido a otro objeto que
pueda manejarlo
Encapsula un comando en un objeto de tal forma que
pueda ser almacenado, pasado a mtodos y devuelto igual
que otro objeto

Interpreter (Intrprete)

Define un intrprete para un lenguaje

Patrones de Comportamiento
Iterator

(Iterador)

Proporciona una forma coherente de acceder


secuencialmente a los elementos de una
coleccin, independientemente del tipo de
coleccin

Mediator

(Mediador)

Simplifica la comunicacin entre los objetos de un


sistema introduciendo un nico objeto que
gestiona la distribucin de mensajes entre los
otros

Patrones de Comportamiento

Observer (Observador)

State (Estado)

Proporciona a los componentes una forma flexible de


enviar mensajes de difusin a los receptores interesados
Permite modificar fcilmente el comportamiento de un
objeto en tiempo de ejecucin

Strategy (Estrategia)

Define un grupo de clases que representa un conjunto de


posibles comportamientos. Estos comportamientos pueden
ser fcilmente intercambiados.

Patrones de Comportamiento
Visitor

(Visitante)

Proporciona una forma fcil y sostenible de


ejecutar acciones en una familia de clases. Este
patrn centraliza los comportamientos y permite
que sean modificados o ampliados sin cambiar
las clases sobre las que actan

Patrones de Comportamiento

Command (Comando)
Propiedades

Tipo: De comportamiento
Nivel: Objeto

Propsito

Encapsular un comando en un objeto de tal forma


que pueda ser almacenado, pasado a mtodos y
devuelto igual que cualquier otro objeto

Patrones de Comportamiento

Command (Comando)

Introduccin

Cuando un usuario selecciona una accin para ejecutarla,


la aplicacin necesita saber desde dnde obtener los
datos y el comportamiento relevantes
Normalmente, la aplicacin mantendr la lgica en un
lugar centralizado
Los usuarios pueden necesitar deshacer las acciones
realizadas
Es lgico combinar la accin en un objeto: el objeto
comando. Ese objeto tiene el comportamiento y los datos
necesario para una accin especfica

Patrones de Comportamiento

Command (Comando)
Aplicabilidad

Dar soporte para deshacer comandos, procesos


de identificacin, etc...
Poner en cola y ejecutar comandos en momentos
distintos
Desacoplar la fuente de una peticin del objeto
que la cumple

Patrones de Comportamiento

Command (Comando)
Descripcin

Una aplicacin que no use el patrn Command


tendr que proporcionar una clase manejadora de
cdigo para controlar todos los eventos que
puedan ocurrir
El patrn Command encapsula los datos y
funcionalidad necesarias para cumplir una accin
o una peticin especficas
Proporciona una separacin entre cundo hay
que ejecutar una accin y cmo tiene que ser
ejecutada

Patrones de Comportamiento

Command (Comando)
Implementacin

Patrones de Comportamiento

Command (Comando)
...

Command: Interfaz de todos los comandos


Invoker: El que decide cuando ejecutar el
comando
Receiver: El objeto sobre el que se ejecutar el
comando
ConcreteCommand: Implementacin de
Command. Mantiene una referencia al Receiver
para realizar las acciones cuando se le llama a
execute

Patrones de Comportamiento

Command (Comando)
Ventajas

Desacopla la fuente o el disparador del evento del


objeto que tiene conocimiento para ejecutar la
tarea
Permite reemplazar los objetos command y
receiver en tiempo de ejecucin
Al ser los comando objetos normales, es ms
sencillo hacer log, deshacer, ...
Facilita la introduccin de nuevos comandos, tan
slo creando una nueva implementacin de
command

Patrones de Comportamiento

Command (Comando)
Variaciones

Deshacer: El patrn command puede ser


extendido para incorporar la posibilidad de
deshacer. Al realizar la accin se guarda lo
necesario para deshacer la accin y se incorpora
un mtodo undo()
MacroCommand: Se puede crear un comando
que est compuesto por otros comandos y que
pueda ser gestionado de manera uniforme
(usando el patrn Composite)

Patrones de Comportamiento

Command (Comando)
Patrones

relacionados

Composite (Compuesto): Para implementar el


patrn compuesto
Memento (Recuerdo): Guarda el estado del
receptor, para crear el deshacer
Prototype (Prototipo): Puede ser usado para
copiar el comando antes de incluirlo en el historial
Singletn (nico): En la mayora de las
aplicaciones, el historial se implementa como un
singleton

Patrones de Comportamiento

Command (Comando)
Ejemplo

(ver cdigo)

En la aplicacin de citas se incorpora un


comando con opciones de deshacer

Ejercicio 4
Incorpora

el patrn Command en el
programa de gestin de estructuras de datos
en el que se permita la accin de deshacer

Patrones de Comportamiento

Iterator (Iterador)
Tambin

conocido como

Cursor

Propiedades

del patrn

Tipo: De comportamiento
Nivel: Componente

Propsito

Proporcionar una forma coherente de acceder


secuencialmente a los elementos de una
coleccin, independientemente del tipo de
coleccin subyacente

Patrones de Comportamiento

Iterator (Iterador)
Introduccin

Las estructuras de datos pueden estar


implementadas de muchas formas
Pueden usarse arrays, listas enlazadas o rboles
(por si los elementos estn ordenados)
Lo habitual es recorrer secuencialmente los
elementos de la coleccin

Patrones de Comportamiento

Iterator (Iterador)

...

Usar un ndice que se va incrementando podra ser muy


ineficiente para implementaciones basadas en rboles o
listas enlazadas
for(int i=0; i<lista.size(); i++){
System.out.println(Elemento:+lista.get(i));
}

El patrn Iterator resuelve este problema definiendo una


interfaz uniforme y eficiente para recorrer cualquier
estructura de datos de forma secuencial,
independientemente de su implementacin

Patrones de Comportamiento

Iterator (Iterador)
Aplicabilidad

Proporcionar una forma uniforme, coherente e


independiente de la implementacin, con el fin de
desplazarse por los elementos de una coleccin
Permitir el recorrido de mltiples colecciones,
permitiendo que distintos clientes naveguen
simultneamente por la misma coleccin

Patrones de Comportamiento

Iterator (Iterador)
Descripcin

El interfaz Iterator tiene las siguientes


operaciones bsicas

Navegacin: Desplazarse hacia delante (y quizs


hacia atrs)
Recuperacin: Obtener el elemento en la posicin
actual
Control de fin de coleccin: Determinar si hay un
elemento siguiente

Algunas versiones extendidas permiten eliminar


el elemento referenciado

Patrones de Comportamiento

Iterator (Iterador)
Implementacin

for(Iterator it = lista.iterator(); it.hasNext();){


Objeto o = it.next();
System.out.println(Objeto: +o);
}

Patrones de Comportamiento

Iterator (Iterador)

Ventajas

Se simplifica el acceso secuencial a los elementos de


cualquier estructura de datos
Java 1.5 incorpora un for mejorado para iterar por los
elementos de cualquier coleccin que implemente Iterable
for(Object objeto: lista){
System.out.println(Objeto: +objeto);
}

Inconvenientes

En estructuras de datos no ordenadas (conjunto, mapa) el


orden de los elementos al recorrerlos puede ser diferente
en diferentes recorridos, lo cual puede generar problemas
si no se tiene en cuenta

Patrones de Comportamiento

Iterator (Iterador)
Ejemplo

(Ver cdigo)

Patrones de Comportamiento

Iterator (Iterador)
Variaciones

del Patrn

Existen iteradores que crean una copia de la


estructura de datos al ser creados, por si se
modifica durante el recorrido
Pueden existir diferentes formas de recorrer
estructuras complejas (rboles, grafos) por tanto,
se podran implementar diferentes iteradores

Patrones de Comportamiento

Iterator (Iterador)
Patrones

relacionados

Factory Method (Mtodo Factora): el mtodo


iterator() es un mtodo factora
Visitor (Visitador)

Ejercicio 5
Implementa

los iteradores correspondientes


en el ejercicio del Dispensador de Fracciones

Patrones de Comportamiento

Observer (Observador)
Tambin

conocido como

Publisher-Subscriptor (Editor-Suscriptor)

Propiedades

del patrn

Tipo: De comportamiento
Nivel: Componente

Propsito

Proporcionar a los componentes una forma


flexible de enviar mensajes de difusin a los
receptores interesados

Patrones de Comportamiento

Observer (Observador)

Introduccin

En muchas ocasiones ciertas partes de un sistema deben


conocer un cambio en otras partes
La solucin tpica es hacer que la parte que cambia
invoque un mtodo de la parte interesada
Pero hay veces que la parte que cambia se desarrolla de
forma independiente a la parte interesada
La parte que cambia es una librera y la parte interesada
est en nuestro programa
La parte que cambia es genrica y la parte interesada no
se puede determinar (un campo de texto en un interfaz de
usuario)

Patrones de Comportamiento

Observer (Observador)
...

Lo ideal es permitir que los interesados indiquen


a la parte que cambia que estn interesados en
los cambios
Las partes interesadas deben implementar un
interfaz, que posee uno o varios mtodos que
sern invocados cuando algo cambie
La parte que cambia guarda a los interesados en
una lista y cuando algn cambio sucede, les
invoca un mtodo del interfaz

Patrones de Comportamiento

Observer (Observador)

Aplicabilidad

Al menos un emisor de mensajes (una parte que cambia y


que notifica el cambio a los dems)
Uno o ms receptores de mensajes
El emisor no conoce como los receptores actan ante el
cambio, simplemente lo notifica
Los receptores pueden no conocerse cuando se desarrolla
el emisor
Suelen ser muy usados en interfaces grficas porque los
componentes son observados por la lgica de la aplicacin
para actuar en consecuencia

Patrones de Comportamiento

Observer (Observador)
Descripcin

Considera una factura con lneas de detalle


El total de la factura depende del total de cada
lnea, que a su vez, depende de la cantidad y del
precio por unidad
Otro tipo de informacin puede depender del total
de la factura
El patrn observer es apropiado porque permite
crear la factura completamente y posteriormente
en el desarrollo, actuar ante cambios

Patrones de Comportamiento

Observer (Observador)

...

Los productores de mensajes (componentes observables)


generan eventos. Uno o ms receptores de mensajes (los
observadores) reciben esos eventos y actan en
consecuencia.
La responsabilidad del componente observable es
transmitir los eventos a los observadores interesados
(aquellos registrados)
Una interfaz oyente permite a los componentes
observables indicar los eventos que han ocurrido y
posiblemente proporcionar detalles a los observadores

Patrones de Comportamiento

Observer (Observador)
Implementacin

Patrones de Comportamiento

Observer (Observador)
...

Observable

La clase cuyos objetos son susceptibles de ser


observados
Proporciona mtodos para registrar un observador o
eliminarlo
Tiene una lista con todos los observadores
registrados
Tiene un mtodo protegido que es invocado dentro de
la clase cuando haya que notificar un cambio a los
observadores

Patrones de Comportamiento

Observer (Observador)
...

Observer

ConcreteObserver

Interfaz que usan los Observable para comunicarse


con los interesados
Implementa la interfaz Observer y determina en la
implementacin de los mtodos como responder a los
mensajes recibidos de Observable

Event

Mantiene informacin sobre el evento o cambio


producido que puede ser til para el Observer

Patrones de Comportamiento

Observer (Observador)
Ventajas

e Inconvenientes

El objeto observable puede ser relativamente


simple porque las acciones que se desencadenan
ante un cambio no estn en la propia clase
Facilita la realizacin de pruebas porque se
puede codificar un observador de log
Facilita el desarrollo incremental porque se
pueden aadir observadores conforme los vayas
codificando

Patrones de Comportamiento

Observer (Observador)
Ventajas

El principal problema del patrn es como hacer


los eventos que se envan
Eventos genricos

e Inconvenientes...

Son ms fciles de codificar pero puede ser difcil


para un observador saber lo que ha pasado

Diferentes Eventos concretos

Los observadores saben con detalle el cambio


Se complica la codificacin de los eventos porque hay
que considerar muchas situaciones

Patrones de Comportamiento

Observer (Observador)
Variaciones

del patrn

En algunas ocasiones puede soportar


nicamente un nico observador
Componentes observables multihilo, cada
notificacin se hace en el hilo del observer
Envo de la referencia al observable en el propio
evento para que los observers puedan invocar
mtodos en el observable con el fin de descubrir
ms informacin sobre el cambio

Patrones de Comportamiento

Observer (Observador)
Patrones

relacionados

Proxy
RemoteProxy

Patrones de Comportamiento

Observer (Observador)
Ejemplo

(ver cdigo)

Ejercicio 6
Independiza

la gestin del socket del control


del protocolo de comunicacin en la
aplicacin de chat
Utiliza el patrn observer para notificar la
llegada de un mensaje a las partes del
programa interesadas

Patrones Estructurales
Describen

formas efectivas de particionar y


combinar los elementos de una aplicacin
El patrn Adapter permite que dos sistemas
se comuniquen
El patrn Facade permite presentar una
interfaz simplificada a un usuario sin eliminar
todas las opciones disponibles en el sistema

Patrones Estructurales
Adapter

Sirve como un intermediario entre dos clases,


convirtiendo las interfaces de una clase para que
pueda ser utilizada por otra

Bridge

(Adaptador)

(Puente)

Divide un componente complejo en dos jerarquas


relacionadas la abstraccin funcional y la
implementacin interna-. Esto hace que sea ms
fcil cambiar cualquier aspecto del componente

Patrones Estructurales
Composite

Desarrolla una forma flexible de crear jerarquas


en estructura de rbol de una complejidad
arbitraria, permitiendo a la vez que todos los
elementos de la estructura funcionen con una
interfaz uniforme

Decorator

(Compuesto)

(Decorador)

Proporciona una forma flexible de introducir o


eliminar funcionalidad a un componente sin
modificar su apariencia externa o su funcin

Patrones Estructurales

Facade (Fachada)

Flyweight (Peso ligero)

Proporciona una interfaz simplificada para un grupo de


subsistemas o un sistema complejo
Reduce el nmero de objetos detallados de muy bajo nivel
en un sistema mediante la comparticin de objetos

Proxy (Representante)

Proporciona un representante de otro objeto, por distintas


razones como pueden ser el acceso, la velocidad o la
seguridad

Patrones Estructurales

Composite (Compuesto)
Propiedades

del Patrn

Tipo: Estructural
Nivel: Componente

Propsito

Desarrollar una forma flexible de crear jerarquas


en estructura de rbol de una complejidad
arbitraria, permitiendo a la vez que todos los
elementos de la estructura funcionen con una
interfaz uniforme

Patrones Estructurales

Composite (Compuesto)
Introduccin

Se desea gestionar un sistema de ficheros


Existen directorios que tienen ficheros y otros
subdirectorios, que pueden tener ficheros
Sin lmite de profundidad
Hay operaciones que se quieren realizar sobre un
directorio o sobre un fichero (tamao en disco,
permisos)

Patrones Estructurales

Composite (Compuesto)
Introduccin...

Para realizar una accin que tenga en cuenta un


subrbol completo, se puede realizar un iterador
que recorra el rbol en un orden determinado y
vaya realizando los clculos
El patrn composite propone utilizar el
polimorfismo y la recursividad para realizar
clculos sobre un subrbol

Patrones Estructurales

Composite (Compuesto)
Introduccin...

Patrones Estructurales

Composite (Compuesto)
Introduccin...

FileSystemElem: Clase padre de Fichero y


Directorio
File: Devuelve el tamao del fichero
Directory: Devuelve la suma de los
FileSystemElem y aade el tamao de almacenar
un directorio en disco (p.e 1kbyte)

Patrones Estructurales

Composite (Compuesto)
Ejemplo

(ver cdigo)

Patrones Estructurales

Composite (Compuesto)
Aplicabilidad

Cuando exista un componente en estructura


rama-hoja, parte-todo, contenedor-contenido
La estructura pueda tener cualquier nivel de
profundidad
Se desea realizar operaciones con todos los
elementos del rbol (o subrbol)

Patrones Estructurales

Composite (Compuesto)
Descripcin

Component

Composite

Clase o interface padre de todos los elementos del


rbol. Especifica las operaciones
Clase que representa a las ramas. Tienen una
coleccin de Component

Node

Clase hoja, contiene el comportamiento final. No


pueden contener otros componentes

Patrones Estructurales

Composite (Compuesto)
Implementacin

Patrones Estructurales

Composite (Compuesto)
Ventajas

e Inconvenientes

Proporciona gran flexibilidad en la estructura y


una interfaz muy manejable
Sin importar la posicin actual en la estructura, se
puede llamar a cualquier mtodo del componente
Al tener tanta flexibilidad es ms complicado de
probar

Patrones Estructurales

Composite (Compuesto)
Variaciones

del patrn

El nodo raz: para mejorar la manejabilidad del


sistema, algunas implementaciones del patrn
Composite definen un objeto distinto que acta
como base para el rbol
Ramificacin con reglas: hay veces en
estructuras complejas que es necesario imponer
restricciones en las composiciones

Patrones Estructurales

Composite (Compuesto)
Patrones

relacionados

Chain of Responsability
Flyweight
Iterator
Visitor

Ejercicio 7
Crea

una estructura de datos orientada a


objetos que permita almacenar expresiones y
que permite calcular su valor

5 + (5 * (2 9))
8 / ( (14 * 34) + (22 + 4) )

You might also like