SlideShare una empresa de Scribd logo
1 de 134
Programación
Orientada a Objetos
PATRONES DE DISEÑO
2
• Una clase es un mecanismo para
encapsulación. Engloba ciertos servicios
proporcionados por los datos y comportamiento
que es útil en el contexto de alguna aplicación.
Una case simple es muy raramente la solución
completa a un problema real.
• Existe un cuerpo creciente de investigación
para describir la manera en que las colecciones
de clases trabajan juntas para la solución de
problemas. Frameworks de aplicación y
Patrones de diseño son dos ideas que se
volvieron populares en este contexto.
Patrones y Frameworks
3
Frameworks de Aplicación
• Un framework de aplicación es un conjunto de clases que
cooperan de manera cercana unas con otras y juntas
crean un diseño reusable para una categoría general de
problemas
• A pesar de que se puede abstraer y discutir el diseño de
los elementos que están detrás del framework, el
framework mismo es un conjunto de clases específicas
que están típicamente implementadas solo en una
plataforma específica o en un conjunto limitado de
plataformas.
• Los frameworks dictan la estructura general y el
comportamiento de la aplicación. Describen como las
responsabilidades ser reparten entre los diferentes
componentes y como estos componentes interactúan.
4
Un Framework como una Librería
de Cabeza
• En una aplicación tradicional el código
específico de la aplicación define el flujo de
ejecución a través del programa,
invocando ocasionalmente código
proporcionado por una librería.
• Un framework revierte esta relación: el
flujo de control es dictado por el framework
y el creador de un nueva aplicación
simplemente cambia algunos de los
métodos invocados por el framework.
• La herencia es frecuentemente utilizada
como un mecanismo poderoso para lograr
esto. Alternativamente, componentes
específicos de la aplicación que obedecen
una interfaz específica se pueden
enchufar.
____
___
_
___
5
Ejemplo de Framework de
Aplicación (1)
• Frameworks de creación de GUI simplifican la
creación de interfaces gráficas para sistemas
de software.
• Un framework de aplicación de GUI implementa
el comportamiento esperado de una interfaz
gráfica de usuario (ventanas, botones, menús,
etc)
• Una nueva aplicación es construida al
especificar y arreglar los elementos necesarios
(botones, menús, campos de texto, etc) y por
redefinir ciertos métodos (repuestas al ratón y
eventos de teclado.
6
Ejemplo de Framework de
Aplicación (2)
• Frameworks de simulación simplifican la creación de
aplicaciones de simulación.
• Un Framework de simulación provee clases de
propósito general para manipular los diferentes tipos de
objeto en una simulación
• El corazón de un framework de simulación es un
procedimiento que itera a través de una lista de objetos
introducidos en la simulación, preguntándole a cada
uno que se actualice a si mismo
• El framework no conoce nada acerca de la aplicación
específica en la que esta siendo usada: bolas de billar,
peces en un tanque, conejos y lobos en un juego
ecológico, etc.
7
Patrones de Diseño
• Los patrones de diseño son un intento de coleccionar y
catalogar las más pequeñas arquitecturas que son
recurrentes en los sistemas OO. Un patrón de diseño
típicamente captura la solución a un problema que ha
sido observado en muchos sistemas.
• Los patrones de diseño son más abstractos que un
framework. Los frameworks son implementaciones
parciales de (sub)sistemas, los patrones de diseño no
tienen una implementación inmediata.
• Los patrones de diseño son elementos arquitectónicos
más pequeños que los frameworks, la mayoría de
aplicaciones y frameworks usan varios patrones.
• Los diseños de patrones son a un nivel arquitectónico
lo mismo que las frases en los lenguajes de
programación.
8
Tipos de Patrones de Diseño
De Clase tratan de la
relación estática entre
las clases y subclases
De Objeto trantan con la
relación entre objetos que
puede cambiar en tiempo
de ejecución
propósito
Creación:
Se preocupan del proceso de creación de un objeto
Estructurales:
Se preocupan de como las
clases y objetos se componen
para formar estructuras
mas grandes.
Comportamiento:
Se preocupan con los
algoritmos y la asignación
de responsabilidades
entre los objetos
scope
9
Patrones de Diseño Creacionales
• Abstraen el proceso de instanciación:
– Encapsulan el conocimiento acerca de que clase
concreta se usa
– Esconde como las instancias de estas clases son
creadas y unidas
• Da gran cantidad de flexibilidad en que se crea,
quien lo crea, como es creado, y cuando es
creado.
• Una patrón de clase creacional usa la herencia
para variar la clase que es instanciada
• Un patrón de objeto creacional delega la
instanciación a otro objeto
10
Patrones de Diseño Estructural
• Los patrones de diseño estructurales se preocupan de
como las clases y objetos se unen para formar
estructuras más grandes.
• Un patrón de clase estructural usa la herencia para
componer interfaces o implementación; la composición
es fijada en tiempo de diseño
• Un patrón de objeto estructural describe la manera de
componer los objetos para crear nueva funcionalidad;
la flexibilidad añadida a la composición de objetos
viene de la agilidad de cambiar la composición en
tiempo de ejecución
11
Patrones de Diseño de
Comportamiento
• Los patrones de diseño de comportamiento se
preocupan acerca de los algoritmos y de la asignación
de responsabilidades entre los objetos.
• Los patrones de clase de comportamiento usan
herencia para distribuir el comportamiento entre las
clases
• Los patrones de objeto de comportamiento usan la
composición de objetos en vez de la herencia.; algunos
describen como un grupo de objetos coopera para
llevar a cabo una tarea que un objeto simple no puede
ejecutar por si mismo; otros tratan acerca de la
encapsulación de comportamiento en un objeto y la
delegación de peticiones a él.
12
Resumen
Patrones
Creacionales
• Singleton
• Abstract
factory
• Factory
Method
• Prototype
• Builder
Patrones
Estructurales
• Composite
• Façade
• Proxy
• Flyweight
• Adapter
• Bridge
• Decorator
Patrones de
Comportamiento
• Chain of Respons.
• Command
• Interpreter
• Iterator
• Mediator
• Memento
• Observer
• State
• Strategy
• Template Method
• Visitor
13
Los elementos de los Patrones de
Diseño
• Un nombre
• El problema que intenta resolver
– Incluye las condiciones para que el patrón sea aplicable
• La solución al problema brindada por el patrón
– Los elementos (clases objetos) involucrados, sus roles,
responsabilidades, relaciones y colaboraciones
– No un diseño o implementación concreta
• Las consecuencias de aplicar el patrón
– Compromiso entre tiempo y espacio
– Problemas de implementación y lenguajes
– Efectos en la flexibilidad, extensibilidad, portabilidad
14
El Patrón Observer: El Problema
Sujeto Observadores
Asume una relación uno a muchos entre objetos,
donde uno cambia y los dependientes deben
actualizarse -Diferentes tipos de
GUI mostrando los
mismos datos
- Diferentes ventanas
mostrando diferentes
vistas de un mismo
modelo.
También conocido como: Dependants, Publish-Subscribe
15
16
Participantes del Patrón Observador
• Sujeto: conoce sus observadores, provee una interfaz
para añadir (subscribir) y eliminar (cancelar)
observadores y provee un método notificar que llama a
actualizar en todos los observadores
• Observador: provee una interfase actualizar
• SujetoConcreto: mantiene el estado relevante para la
aplicación, provee métodos para obtener y setear ese
estado, llama a notificar cuando el estado es cambiado
• ObservadorConcreto: mantiene una referencia al sujeto
concreto, guarda el estado que se mantiene
consistente con el del sujeto e implementa la interfaz
actualizar
17
18
La Colaboración en el Patrón
Observer
• El SujetoConcreto notifica a sus observadores cada
vez que se produce un cambio que pueda volver el
estado de los observadores inconsistente.
• Después de ser informados de un cambio, el
Observador Concreto puede preguntar al Sujeto acerca
de la información concerniente a su estado y entonces
reconciliar su propio estado con el del Sujeto.
• El cambio en el SujetoConcreto pude ser iniciado o uno
de los ObservadoresConcretos por algún otro objeto
de la aplicación
19
20
21
Las Consecuencias del Patrón
Observador
• + Aparejamiento abstracto y mínimo entre el Sujeto y el
Observador: El sujeto no conoce la clase concreta del
observador, las clases sujetoconcreto y
observadorconcreto pueden ser reusadas
independientemente, los sujetos y observadores
pueden incluso pertenecer a diferentes capas de
abstracción del sistema
• + Soporte para comunicación broadcast: la notificación
enviada por el sujeto no necesita especificar un
receptor, se transmitirá a todos las partes interesadas
(subscritas)
• - Actualizaciones no esperadas: los observadores no
tienen conocimiento de la existencia de los demás, una
pequeña operación pueda causar una cascada de
actualizaciones innecesarias.
22
La implementación del patrón
Observador (1)
• Mapear los sujetos a sus observadores: El sujeto mantiene
referencias explícitas a los observadores a los que debe
notificar o una tabla de búsqueda es instalada; hay un
compromiso entre tiempo y memoria.
• Observar a más de un sujeto: pude ser necesario en
algunas situaciones; la interface actualizar debe ser
extendida para llevar registro del sujeto que esta enviando
el mensaje de actualización, permitiendo al observador
saber que sujeto debe examinar.
• Quien dispara los cambios (quien llam a notificar):
– Todas las operaciones en el sujeto llaman a notificar luego de
cambiar el estado del sujeto. Operaciones consecutivas pueden
causar actualizaciones consecutivas que pueden no ser necesarias
y no es eficiente
– Hacer llamadas a notificar es responsabilidad del cliente; esto es
propenso a error
23
La implementación del patrón
Observador (2)
• Las referencias colgantes a sujetos borrados: borrar un
sujeto no debe producir referencias colgantes en sus
observadores; solamente borrar el observador no es
tampoco, frecuentemente, una buena idea. Cuando se
borra un Sujeto los Observadores deben ser notificados
de tal manera que puedan resetear sus referencias al
Sujeto.
• Asegurarse que el Sujeto es consistente antes de llamar
a notificar: los observadores preguntarán el nuevo estado
del sujeto en su actualización; esta regla es fácilmente
violada sin intención cuando la subclases de Sujeto
llaman a operaciones heredadas
• Especificar modificaciones de interés de manera explícita:
la eficiencia en la actualización puede ser mejorada
cuando los observadores se registran por eventos de
interés solamente
24
La implementación del patrón
Observador (2)
• Evitar protocolos de actualización propios del observador,
los modelos pull y push:
– En el modelo push, el sujeto envía a sus observadores información
detallada en que ha cambiado; la clase sujeto hace la asunción
acerca de las necesidades del Observador.
– En el modelo pull el Sujeto envía nada más que la información
mínima de notificación y el Observador pregunta por los detalles de
manera explícita; esto hace énfasis en la ignorancia del Sujeto de
sus Observadores; puede ser ineficiente porque los Observadores
deben acceder lo que ha cambiado sin ayuda.
• Encapsula actualizaciones semánticamente complejas:
instala un administrador explícito de cambio que maneja la
relación Sujeto-Observador y define una estrategia
particular de actualización
25
26
El Patrón Composite: El Problema
Compone objetos en estructuras de árbol para
representar jerarquías parte-todo y deja que los
clientes traten a los objetos individuales y
composiciones de manera uniforme
- Una herramienta de dibujo que
permite a los usuarios construir
diagramas complejos a partir de
elementos simples
-Árboles con nodos
heterogéneos, ej. El árbol de
parsing de un programa
27
28
29
Participantes del patrón de
composición
• Componentes: declaran al interfaz para objetos en la composición,
implementa el comportamiento por defecto para la interface común de
todos los objetos, declara una interfaz para acceer y manejar los
componentes hijo, opcionalmene define/implementa una interfaz para
acceder al componente padre
• Hoja: define el comportamiento para objetos primitivos de la
composición
• Composición: define el comportamiento para los componentes que
tengan hijos, guarda los componentes hijos, implemente acceso a los
hijos y administran las operaciones en la interfaz del componente
• Cliente: manipula llos objetos en la composición a través de la interfaz
componente
• Client: manipulates objects in the composition through the component
interface
30
31
32
Colaboración en el Patrón de
Composición
• Los clientes usan la interfaz de la clase
componente para interactuar con los objetos de
la composición
• Si el receptor es una hoja, la petición es
manejada directamente
• Si el receptor es una composición la petición es
usualmente enviada a los hijos componentes,
algunas operaciones se pueden ejecutar antes
y/o después de enviarla.
33
Las consecuencias del Patrón
Composición
• + Hace al cliente más simple: los clientes pueden tratar
a las estructuras compuestas y a los individuos de
manera uniforme, los clientes normalmente no
necesitan saber y no les debería importar si están
tratando con una hoja o una composición.
• + Hace más fácil añadir un nuevo tipo de componentes:
el código del cliente trabaja automáticamente con las
composiciones u hojas recién definidas
• - Puede volver al diseño muy general: la desventaja de
hacer sencillo el añadir nuevos componentes es que
eso dificulta restringir los componentes de una
composición, algunas veces en la composición se
desea solo cierto tipo de hijos. Con el patrón
Composición no se pude confiar en que el sistema hará
cumplir esto.
34
La implementación del Patrón
Composición (1)
• Referencias explícitas al padre: simplifica el recorrido y manejo
de estructuras compuestas; son definidas mejor en la clase
Componente; es esencial para mantener la invariabilidad de que
todos los hijos de una composición tienen como padre a una
composición que a su vez los tiene como hijos.
• Compartición de componentes: puede ser útil por ejemplo para
reducir los requerimientos de almacenamiento, pero puede
llevar a ambigüedades cuando se requiera recorrer la estructura
hacia arriba.
• Maximizar la interface del componente: para lograr que los
clientes no conozcan la clase de hoja o composición que estan
usando., la clase componente debería definir tantas
operaciones comunes en las clases Hoja y Composición como
sea posible; esto entra en conflicto con el diseño de la jerarquía
de clases que dice que una clase solo debe implementar las
operaciones que tienen sentido en todas sus subclases. Se
requiere cierta creatividad para encontrar buenas
implementaciones por defecto ( ej. Hijos (hoja) = {})
35
La implementación del Patrón
Composición (2)
• El acceso a los hijos y el manejo de operaciones: definir la
interfaz para el manejo de los hijos a nivel del componente
da transparencia pero afecta la seguridad, los clientes
pueden hacer cosas sin sentido tales como añadir o borrar
una hoja, esto debe capturarse en una implementación
estándar: no hacer nada o arrojar un error
• Las variables de instancia mantienen a los hijos:
comúnmente estas variables de instancia pertenecen donde
las operaciones de acceso y manejo están, pero cuando
están en la clase componente, se tiene un penalidad de
espacio, ya que las Hojas nunca tienen hijos.
• Borrar componentes: en los lenguajes sin recolección de
basura es mejor hacer a la Composición de borrar a sus
hijos: una excepción es cuando una objeto hoja es
compartido.
36
La implementación del Patrón
Composición (3)
• La estructura de datos para guarda hijos: una variedad de
estructuras de datos están disponibles: listas, árboles,
arreglos, tablas has; la elección depende en la eficiencia;
alternativamente cada hijo puede ser guardado en una
variable de instancia separada; todas las operaciones de
acceso y manejo deben entonces ser implementadas en
cada subclase composición.
• Ordenamiento de hijos: cuando el orden de los hijos es un
problema, la interfaz de acceso y manejo de los hijos debe
estar diseñada cuidadosamente para manipular esta
secuencia
• Caching: cuando la composición necesita ser recorrida o
buscada frecuentemente la clase composición puede hacer
caching de la información de sus hijos; los cambios a un
componente requiere invalidad los caches de su padre.
37
El patrón Singleton: El Problema
Asegura que una clase tiene exactamente una instancia
y provee una punto global de acceso a ella.
-Solo puede haber una
cola de impresión, un
sistema de archivos, un
manejador de ventanas en
una aplicación estándar
- Existe solo un tablero de
juego en monopolio, un
laberinto en el juego de
Pacman
Monopoly Board
: Monopoly Board : Monopoly Board
38
Participación y Colaboración en
el Patrón Singleton
Participante:
• Singleton:
– Es responsable por crear y almacenar su propia
instancia única.
– Define una operación Instancia que permite al los
clientes acceder su única instancia
Colaboración
– La operación Instancia a nivel de clase retorna o
crea una sola instancia; un atributo a nivel de clase
contiene un valor por defecto indicando que no hay
una instancia todavía o una sola instancia
39
40
Consecuencias del Patrón
Singleton
• + Acceso controlado a una sola instancia: debido a que el
Singleton encapsula su sola instancia, tiene control estricto
sobre ella.
• + Reduce el espacio de nombres: es una mejora a polucionar
el espacio de nombres con variables globales que contendrán
instancias únicas
• + Permite refinamiento de operaciones y representación: la
clase Singleton puede tener subclases y la aplicación pude ser
configurada con una instancia de la clases necesitada en
tiempo de ejecución
• + Permite un número variable de instancias: el mismo
acercamiento puede ser usado para controlar el número de
instancias que existen; una operación que de acceso a la
instancia debe ser proveída
• + Mas flexible que usar una clase con operaciones solamente.
41
La Implementación del Patrón
Singleton
• Asegurar una única instancia:
– El constructor o operación new debe estar protegida o
sobrescrita para evita que se creen otras instancias
accidentalmente por código del usuario.
• Subclases de la clase Singleton:
– El principal problema es instalar una única instancia de
un tipo deseado en tiempo de ejecución
– Cuando todas las subclases son conocidas de antemano
la operación Instancia puede ser un condicional y crear la
instancia correcta dependiendo de algún parámetro y
alimentación del usuario
– Cuando las subclases no son conocidas de antemano un
registro puede ser usado: todas las subclases se
registran antes de instanciarse; la operación Instancia
escoge la instancia correcta dependiendo de esto.
42
El patrón Abstract Factory: El
Problema
Provee una interfaz para crear familias de objetos
relacionados o dependientes sin especificar su clase
concreta
-Un toolkit GUI que
soporta múltiples
visualizaciones
- Lograr portabilidad a
través de
aplicaciones en
diferentes sistemas
de ventanas
También llamada: Kit
43
44
Los participantes del Patrón de
Fábrica Abstracta
• AbstractFactory: declara una interfase para
operaciones que crean objetos de productos
abstractos
• ConcreteFactory: implementa las operaciones para
crear objetos de productos concretos
• AbstractProduct: declara una interfase para un tipo
de objeto producto
• ConcreteProduct: define un objeto producto a ser creado
por su correspondiente fábrica; implementa la interfase
AbstractProduct
• Cliente: usa sola interfaces declaradas por AbstractProduct
y AbstractFactory
45
46
47
Colaboración en el Patrón de
Fábrica Abstracta
• AbstractFactory difiere la creación de los
objetos productos a su subclase
ConcreteFactory
• Una instancia simple de ConcreteFactory es
creada en tiempo de ejecución; esta fábrica
concreta crea objetos producto que tienen una
implementación dada
48
Consecuencias del Patrón
Fábrica Abstracta (1)
• + Clases concretas aisladas: la AbstractFactory
encapsula la responsabilidad y el proceso de crear
objetos producto, aísla al cliente de las clases con
implementación; los clientes manipulan las instancias a
través de sus interfaces abstractas; los nombres de las
clases producto no aparecen en el código cliente.
• + Hace fácil el intercambio de familias de
productos: la clase ConcreteFactory aparece
solamente una vez en la aplicación, esto es, donde es
instanciada, así que es fácil de remplazar; dado que la
fábrica abstracta crea una familia entera de productos,
la familia completa pude cambiar de manera sencilla
49
Consecuencias del Patrón
Fábrica Abstracta (2)
• + Promueve la consistencia entre productos: cuando
los productos en una familia son diseñados para
trabajar juntos, es importante para la aplicación el usar
los objeto de una sola familia; el patrón de fábrica
abstracta hace fácil cumplir esto.
• +- Soportar nuevos tipos de productos es difícil:
extender las fábricas abstractas para producir una
nueva clase de producto no es fácil porque el conjunto
de los produtos que pueden ser creados es fija en la
interface AbstractFactory; soportar nuevas clases de
productos requiere extender la interfase lo que
involucra cambiar la clase AbstractFactory y todas sus
subclases
50
Implentación del Patrón Fábrica
Abstracta (1)
• Las fábricas son singletons: una aplicación necesita
solamente una instancia de una fábrica concreta por
familia de productos, así que es mejor implementarla
como un singleton
• Creando nuevos productos:
– AbstractFactory solo declara una interfaz para crear productos,
le corresponde a las subclases de ConcreteFactory crear
verdaderamente los productos
– La forma más común de hacer esto es usar un método-fábrica
para cada producto; cada fábrica concreta especifica su
producto al sobrescribir cada método-fábrica; es simple pero
requiere una nueva fábrica concreta para cada producto en la
familia, aun si solo difieren levemente.
– Una alternativa es implementar las fábricas concretas con el
patrón prototipo; la fábrica concreta es inicializada con una
instancia prototípica de cada producto y crea nuevos
productos por clonación
51
Implentación del Patrón Fábrica
Abstracta (2)
• Definir fábricas extensibles:
– Un diseño más flexible pero menos seguro es proveer
una fábrica abstracta con un función “hacer” que tome
como parámetro el tipo de objeto a crear (como
cadena o identificador de clase)
– Es más fácil de realizar en un lenguaje dinámico que
en uno estático por el tipo retornado por esta
operación “hacer”
– Puede ser usado en C++ solo si todos los objetos
productos tienen una clase base común o si los objeto
productos pueden ser coercionados en el tipo que el
cliente que pida el producto requiera. En este último
los productos retornados tienen todos la misma
interfaz abstracta y el cliente no podra diferenciar o
hacer asunciones acerca de la clase del producto
52
El Patrón Factory Method: El
Problema
Define una interfaz para crear un objeto pero deja
que las subclases decidan que objeto instanciar
- Cuando frameworks o
toolkits uan clases
abstractas para definir
y manter relaciones
entre objetos y son
responsables de crear
también los objetos
Conocida también como : Virtual constructor
53
54
55
Participantes y Colaboración en
el Patrón de la Método Fábrica
• Producto: define la interfase de los objetos que el método
fábrica crea
• ProductoConcreto: implementa la interfase Producto
• Creador
– Declara el método fábrica, que retorna un objeto tipo Producto;
pude definir una implementación por defecto
– Puede llamar al método fábrica para crear objetos Producto
• CreadorConcreto: sobrescribe el método fábrica para devolver una
instancia de ProductoConcreto
• El Creador se basa en sus subclases para definir el
método fábrica que retorna una instancia de
ProductoConcreto
56
Consecuencias del Patrón
Método Fábrica
• + Elimina la necesidad de unir clases
específicas de la aplicación dentro de tu código
• - Los clientes pueden tener que crear una
subclase de Creador solo para crear un
ProductoConcreto particular
• + Provee ganchos para las subclases: el
método fábrica da a las subclases un gancho
para proveer una versión extendida de un
objeto
• + Conecta jerarquías paralelas de clases: un
cliente puede usar un método fábrica para crear
una jerarquía paralela de clases.
57
Implementación del Patrón
Método Fábrica (1)
• Existen dos variedades mayores:
– (1) la clase Creador es una clase abstracta y no
provee una implementación para el método fábrica que
declara; las subclases son requeridas para proveer una
implementación.
– (2) la clase Creador es concreta y provee una valor por
defecto para la implementación del método fábrica: le
método fábrica solamente da flexibilidad a las
subclases para crear diferentes objetos.
– El método fábrica puede ser parametrizado con algo
que identifica al objeto a crear (el cuerpo es entonces
un condicional); sobrescribir un método fábrica
parametrizado hace fácil selectivamente extender o
cambiar los productos que son creados
• Usar convención de nombres puede hacer claro
que se esta usando métodos fábrica
58
Implementación del Patrón
Método Fábrica (2)
• En C++
– Los métodos fábrica son siempre métodos virtuales y
son frecuentemente puramente virtuales
– Se debe tener cuidado de no llamar al método fábrica en
el el constructor del Creador porque el método fábrica
en el CreadorConcreto no esta disponible todavía
– Esto se pude evitar al acceder a productos solamente a
través de operaciones de acceso que crean el producto
bajo demanda; el constructor inicializa a 0, el accesor
verifica y crea el producto si este no existe todavía
(inicialización ociosa)
• Usar plantillas para evitar las subclases: en vez de
crear una subclases de Creador para cada
ProductoConcreto, una plantilla subclase de
Creador puede ser provista que esta parametrizada
con la clase Producto
59
El Patrón Prototipo: El Problema
Especificar las clases de objetos a crear usando una
instancia prototípica y crear nuevas instancias al copiar
el prototipo.
- Cuando las aplicacioens
necesitan la flexibilidad de
ser capaces de especificar
la clase a instanciar en
tiempo de ejecución
- Cuando las instancias de
una clase tienen solamente
pocas combinaciones de
estado
60
Participantes y Colaboraciones
en el Patrón Prototipo
• Prototipo: declara una interfaz para clonarse a
si mismo
• PrototipoConcreto: implementa una operación
para clonarse a si mismo
• Cliente: crea un nuevo objeto al pedir al
prototipo que se clone a si mismo
• El Cliente pide al Prototipo que se clone a si
mismo
61
62
63
Consecuencias del Patrón
Prototipo (1)
• + Esconde del cliente las clases concretas del productos: El
cliente puede trabajar con las clases específicas de la aplicación
sin necesidad de modificarlas.
• + Los productos pueden ser añadidos y removidos en tiempo de
ejecución: nuevos productos concretos pueden ser incorporados
solo registrándolos con el cliente
• + Especificar nuevos objetos por valores cambiantes: nuevas
clases de objetos pueden ser efectivamente definidos al instanciar
una clase específica, llenar algunas de sus variables de instancia
y registrarla como un prototipo
• + Especificar nuevos objetos por una estructura variante:
estructuras complejas definidas por el usuario pueden ser
registradas como prototipos también y ser usads una y otra vez al
clonarlas
64
Consecuencias del Patrón
Prototipo (2)
• + Reduce las subclases: al contrario que el Método Fábrica, que a
menudo produce una jerarquía de clase creadora que asemeja al
jerarquía de ProductosConcretos
• + Configura una aplicación con clases dinámicamente: cuando el
ambiente de tiempo de ejecución soporta carga dinámica de
clases, el patrón de prototipo es una llave para explotar esas
facilidades en un lenguaje estático (los constructores de las
clases cargadas dinámicamente no pueden ser accesadas de
manera estática; en vez de esto el ambiente de tiempo de
ejecución crea automáticamente una instancia del prototipo que la
aplicación puede usar a través del manejador de prototipos)
• - Implementar la operación Clonar: es difícil cuando las clases en
construcción existen o cuando internamente se incluye objetos
que no soportan la copia o tiene referencias circulares
65
Implementación del Patrón
Prototipo
• Usar un manejador de prototipos: cuando el número de
prototipos en un sistema no es fijo, es mejor usar un registro
de los prototipos existentes
• Implementar la operación clonación: muchos lenguajes dan
soporte a la implementación del operador clonación
(constructores de copia en C++, método copy en Smalltalk,
guardar + cargar en sistemas que lo soportan) pero en si
mismos no solucionan el problema de la copia superficial /
profunda
• Inicializar clones: algunos clientes son felices con el clone
como esta, otros desean inicializarlo; pasando parámetros a
la operación clonar elimina la uniformidad de la interfase.
Hay que utilizar las operaciones de cambio de estado luego
de la clonación o proveer un método Inicializar
• En lenguajes que tratan a las clases como objetos de primera
clase, el objeto clase en si mismo es como el prototipo para
crear instancias de cada clase
66
Title
Hello you!
El Patrón Builder Pattern: El
Problema
Separar la construcción de un objeto complejo de su
representación de tal manera que el mismo proceso de
construcción pueda crear diferentes representaciones
- Un lector RTF que
puede convertir en
varios formatos
- Un parser que
produce un árbol de
parsing complejo
Title
Hello you!
<B><FONT FACE="Arial" SIZE=6><P>Title</P>
</B></FONT><FONT FACE="Times">
</FONT><I><FONT FACE="Arial"><P>Hello you!</P></I></FONT></BODY>
</HTML>
Save-as command
of Word
67
68
Participantes del Patrón
Constructor
• Constructor: especifica una interfaz abstracta para crear partes
de un Producto
• ConstructorConcreto:
– Construye y ensambla las partes de un Producto al implementar la
interfase Constructor
– Define y sigue la pista de la representación que crea
– Provee una interfase para recuperar el producto
• Director: construye un objeto usando la interfaz del Constructor
• Producto:
– Representa el objeto complejo en construcción
– Incluye clases que definen las partes constituyentes incluyendo las
interfaces para ensamblar las partes en un resultado final
69
70
Colaboración en el Patrón
Constructor
• El cliente crea al objeto Director y lo configura
con el objeto Constructor deseado.
• El Director notifica al constructor que parte del
producto debe ser construida
• El constructor maneja los requerimientos del
director y añada partes al producto
• El cliente recupera el producto del constructor
71
72
Consecuencias del Patrón
Constructor
• + Permite variar la representación interna del producto:
los directores usan la interfaz abstracta provista por el
constructor para construir el producto; para cambiar la
representación del producto, solo se debe hacer un
nuevo tipo de constructor.
• + Permite el reuso de los Constructores Concretos:
todo el código para la construcción y representación
esta encapsulado; diferentes directores usan el mismo
Constructor Concreto
• + Da un control más fino sobre el proceso de
construcción: En otros patrones creacionales, la
construcción se realiza en un solo paso; aquí el
producto es construido paso a paso y bajo la guía del
director dando un control más fino sobre la estructura
interna del producto resultante
73
Implementación del Patrón
Constructor
• Interfaces de Ensamblaje y Construcción:
– La interfaz del Constructor debe ser generalmente suficiente para
permitir la construcción de productos de toda clase de
Constructores Concretos
– El modelo para la construcción y ensamblaje es una decisión
importante del diseño
• ¿Por qué no clases abstractas para los productos?:
– En el caso común, los productos pueden diferir tanto en sus
representaciones que se gana muy poco dando a todos los
productos una clase padre común.
– Debido a que el cliente configura al Director con el Constructor
Concreto adecuado, el cliente conoce el producto resultante.
• Métodos vacíos como valor por defecto en el Constructor
– En C++ los métodos para construir son intencionalmente no
puramente virtuales sino métodos vacíos; esto permite al cliente
sobrescribir solamente las operaciones en las cual está interesado.
74
El Patrón Façade: El Problema
Provee una interfaz unificada de alto nivel a un
grupo de interfaces en un subsistema para hacer
que el subsistema sea más fácil de usar.
•Provee una interfaz
simple a un subsistema
complejo
•Desacopla un subsistema
de sus clientes y otros
subsistemas
•Crea capas de
subsistemas al proveer
una interfaz para cada
nivel del subsistema.
facade
Clases Cliente
Clases Subsistema
75
76
77
Participantes y Colaboración del
Patrón Fachada
• Fachada:
– Sabe que clases del subsistemas son responsables para cada
petición
– Delega las peticiones de los clientes a los subsistemas
apropiados
• Clases del Subsistema
– Implementan la funcionalidad del subsistema
– Manejan el trabajo asignado por el objeto Fachada
– No tienen conocimiento del objeto Fachada. Ej.: no mantienen
una referencia a él.
• Los clientes envía su petición a Fachada la que a su vez
se lo envía al objeto apropiado en el subsistema
78
79
Consecuencias del Patrón
Fachada
• + Escuda a los clientes de los componentes del
subsistema reduciendo el número de objetos
con que los clientes tienen que trabajar,
haciendo al subsistema más fácil de usar
• + Promueve el aparejamiento débil entre el
subsistema y sus clientes, permitiendo que los
componentes del subsistema cambien sin
afectar a los clientes.
• + Reduce las dependencias de compilación en
sistemas grandes de software
• + No previene que las aplicaciones usen las
clases del subsistemas si así lo necesitaren
80
Implementación del Patrón
Fachada
• El aparejamiento entre clientes y subsistemas puede ser
reducido aún más:
– Al hacer Fachada una clase abstracta con subclases concretas
para diferentes implementaciones de un subsistema; este
aparejamiento abstracto evita que los clientes conozcan la
implementación de un subsistema que están usando.
– Al configurar el objeto fachada con diferentes objetos
subsistema; para personalizar simplemente remplace uno o más
objetos subsistema
• Clases del subsistemas Publicas vs. Privadas: la
fachada es parte de la interfaz pública de un subsitema,
junto con las clases del subsistema a las que algunos
cliente acceden directamente (muy pocos lenguajes OO
soportan la noción de clases de subsistema privado a
pesar de que sería una características muy útil.
81
El Patrón del Proxy: el Problema
Provee un subrogante de otro objeto para controlar
el acceso a este.
• un proxy remoto provee una representación
local de un objeto en un espacio de direcciones
diferente
•Un proxy virtual crea objejos caros bajo
demanda
•Un proxy de protección controla el acceso al
objeto original y es útil cuando los objetos tiene
diferentes derechos de acceso.
•Una referencia inteligente es un remplazo de
un puntero que realiza acciones adicionales
cuando un objeto es accesado. Ej. Contar
referencias
proxy
Clase Cliente
Clase Real
82
83
84
Participantes del Patrón Proxy (1)
• Proxy:
– Mantiene una referencia que permite al proxy acceder al sujeto
real
– Provee una interfase idéntica a la del Sujeto de tal manera que el
proxy puede sustituir al objeto real
– Controla el acceso al sujeto real y puede ser responsable de su
creación y borrado.
– Los Proxies remotos son responsables por la codificación de un
requerimiento y sus argumentos y por enviar el requerimiento al
sujeto real en otro espacio de direcciones.
– Los proxies Virtuales pueden guardar información acerca del
sujeto real de tal manera que puede posponer el acceso a él.
– Los proxies de protección verifica que el que llama tiene acceso y
permiso para llevar a cabo la petición
85
86
Participantes y Colaboración del
Patrón Proxy (2)
• Sujeto:
– Define una interfaz común para el SujetoReal y Proxy,
de tal manera que el Proxy puede ser usado en
cualquier lugar donde se pida un SujetoReal
• SujetoReal
– Define el objeto real que el proxy representa
• El Proxy envia la petición al SujetoReal cuando es
apropiado (depende del tipo de proxy)
87
88
Consecuencias de Patrón Proxy
• + El patrón Proxy introduce un nivel de indirección
cuando se accede al objeto. Esta indirección tiene
varios usos:
– Un proxy remoto puede esconder el hecho de que un objeto
reside en un espacio de direcciones diferente
– Un proxy virtual puede ejecutar optimizaciones
– Tanto el proxy de protección como los punteros inteligentes
permiten mantenimiento adicional
• + El patrón de proxy puede ser usado para implementar
“copia-al-escbir” : para evitar copiar innecesariamente
objetos granes, el sujeto real es referenciado; los
requerimientos de cada copia incrementan este
contador, pero solo cuando un cliente pide una
operación que modifica al sujeto, el proxy lo copia.
89
Patrón Flyweight Pattern: El
Problema
Algunas aplicaciones se benefician del uso de
objetos en su diseño,pero implementaciones
simples son prohibitivamente caras por el gran
número de objetos
• Use un objeto para
cada caracter en el texto
en el editor de texto
•Use un objeto posiciòn
para cada elemento del
GUI
h a l l o
Column
a
Fila
Caracter
90
91
92
93
94
Aplicabilidad del Patrón
PesoMosca
• Aplicar pesomosca si Todo lo siguiente es verdad:
– Una aplicación usa un número grande de objetos
– El costo de almacenar es alto debido a la cantidad de
objetos
– La mayoría de los objetos puede ser hecho intrinseco
– Most objects can be made extrinsic
– Muchos grupos de objetos pueden ser remplazados
con relativamente pocos objetos compartidos una vez
que su estado extrínseco es removido.
– Las aplicaciones no dependen de la identidad del
objeto
95
Participantes del Patrón
PesoMosca (1)
• Flyweight
– Declara una interfase a través de la cual flyweights
pueden recibir y actuar según su estado extrínseco
• Concrete Flyweight
– Implementa la interfaz del flyweight y añade
almacenamiento para el estado intrínseco.
– Un objeto flyweight concreto debe ser compartible; Ej.
Dos estado debe ser intrínsico
• Unshared Concrete Flyweight
– No todos las subclases flyweights necesitan ser
compartidas, flyweight concretos no compartidos
pueden tener objetos flyweight concretos a algún nivel.
96
Participantes del Patrón
PesoMosca (2)
• Fábrica Flyweight
– Crea y maneja objetos flyweight
– Asegura que los flyweights son compartidos
adecuadamente; cuando un cliente pide un
flyweight la fábrica flyweight devuelve un objeto
existen de un repositorio o crea uno y lo añade
al repositorio
• Cliente
– Mantiene una referencia hacia el o los flyweights
– Calcula o guarda el estado extrínseco de los
flyweights
97
98
Colaboraciones del Patrón
PesoMosca
• El estado que un flyweight necesita para funcionar debe
ser caracterizado como intrínseco o extrínseco. El estado
intrínseco es guardado en el objeto flyweight concreto; el
extrínseco esta guardado o computado por los objetos
clientes. El cliente pasa este estado al flyweight cuando
invoca operaciones.
• Los clientes no deben instanciar los flyweights concretos
directamente. El cliente debe obtener los objetos flyweight
concretos exclusivamente de la fábrica de flyweight para
asegurar que se compartan adecuadamente
99
100
Consecuencias del Patrón
PesoMosca
• - Los Flyweights pueden introducir costos en tiempo de
ejecución asociados con la transferencia, búsqueda, y/o
cálculo del estado extrínseco.
• + El incremento de los costos de tiempo de ejecución son
compensados por ahorros de almacenamiento, el cual
decrece
– Tanto cuanto más flyweights son compartidos
– Tanto cuanto la cantidad de estado intrínseco sea considerable
– Tanto cuanto la cantidad de estado extrínseco es considerable pero
puede ser calculado.
• - El patrón flyweight se combina con el patrón composición
para construir un grafo con varios nodos hoja. Debido a la
compartición los nodos hojas no pueden guardar a su padre lo
cual ocasiona un impacto mayor en como los objetos de la
jerarquía se comunican.
101
Implementación del Patrón
PesoMosca
• Remover el estado extrínseco:
– Identificar el estado extrínseco y removerlo de los objetos
compartidos
– Remover el estado extrínseco no ayudará si hay tantas clase
de estados extrínsecos como objetos antes de compartir.
– Idealmente el estado extrínseco pude ser calculado desde un
objeto estructura separado con menos requerimientos de
memoria.
• Manejando objetos compartidos:
– Use un almacenaje asociativo con la fábrica flyweight para
dejar que los clientes encuentren un flyweight particular
– Una forma de cuenta de referencia o de colección de basura
es necesaria para recuperar el almacenamiento de los
flyweights cuando estos ya no se usen
– Cuando el número de flyweights es pequeño y fijo, considere
inicializar el repositorio y mantener a los flyweights
permanentemente
102
First
Next
IsDone?
CurrentItem
El Patrón Iterador: El Problema
Provee una manera de acceder a elementos en un
objeto agregado secuencialmente sin exponer la
representación Interna
• Soporta múltiples tipso
de recorridos de objetos
agregados
• Provee una interfaz
uniforme para recorrer
estructuras agregadas
(iteración polimórfica)
( a b c d e)
a b c d e
a
b
d
c
e
103
104
Participantes y Colaboración del
Patrón Iterador
• Iterador
– Define una interfaz para acceder y recorrer elementos
• IteradorConcreto
– Implementa la interfaz iterador
– Mantiene la pista de la posición actual en el recorrido
del agregado.
• Agregado
– Define una interfase para definir un objeto Iterador
• AgregadoConcreto
– Implementa la interfaz de creación de un iterador para
retornar una instancia del propio IteradorConcreto
• Un IteradorConcreto mantiene la pista del objeto
actual en el agregado y puede calcular el
siguiente objeto en el recorrido.
105
106
107
Consecuencias del Patrón
Iterador
• + Soporta la variación en el recorrido de un agregado:
agregados complejos pueden ser recorridos de
diferentes maneras, los iteradores hacen fácil cambiar
el algoritmo de recorrido solamente usando una
instancia diferente de iterador.
• + Simplifica la interfaz del agregado: La interfaz
agregado no esta obstaculizada por el soporte de
varios tipos de recorrido.
• + Más de un recorrido puede estar pendiente en el
mismo agregado: un iterador mantiene registro de su
propio estado de recorrido, por lo tanto más de un
recorrido puede estar en progreso al mismo tiempo.
108
Implementación del Patrón
Iterador (1)
• ¿Quién controla el iterador? Un iterador interno tiene control
absoluto sobre la iteración completa, los clientes entregan una
operación a ser realizar y el iterador aplica esa operación a
cada uno de los elementos del agregado. Con un iterador
externo, el cliente controla la iteracción. Ej.: el cliente avanza
el recorrido al pedir el siguiente ítem explícitamente. Los
iteradores externos son más flexibles (comparar dos
coleccíones es practicamente imposible. Los iteradores
internos son más fáciles de usar pero son más débiles en
lenguajes que no soportan objetos como primera clase.
• ¿Quién define el algoritmo de recorrido? El iterador puede ser
responsable del algoritmo de recorrido en dicho caso es fácil
usar diferentes algoritmos de recorrido en el mismo agregado
y usar el mismo algoritmo en agregados diferentes. El
agregado en si mismo puede ser responsable de el algoritmo
de recorrido y el iterador solo guara el estado de la iteración
(cursor)
109
Implementación del Patrón
Iterador (2)
• ¿Cuan robusto es el iterador? Un iterador robusto asegura que la
inserción y remoción no interfieren con el recorrido (y lo hace si no
se copia el agregado). Los iteradores robustos pueden por
ejemplo ser implementados a través de registrar los iteradores
con el agregado y hacer que el agregado ajuste el estado interno
de los iteradores después de una inserción o borrado de
elementos.
• Iteradores Polimórficos en C++ tiene un costo, requieren que el
objeto iterador sea asociado dinámicamente por el método
fábrica. Por esto si no hay necesidad de polimorfismo use
iteradores concretos los cuales pueden ser alojados en la pila.
Los iteradores polimórficos tienen otro problema, deben ser
eliminados por el código cliente, lo cual es propenso a errores. El
patrón proxy ofrece una solución. Usar la pila para alojar el proxy
del iterador real, hacer que el proxy asegure eliminar el iterador al
borrarse, de tal manera que cuando el proxy se destruya, también
lo hace el objeto iterador.
110
Implementación del Patrón
Iterador (3)
• Los iteradores pueden tener privilegios de acceso: un iterador
pude ser visto como una extensión del agregado que lo crea.
El iterador y el agregado están fuertemente aparejados. En
C++ pueden ser hechos amigos de tal manera que el agregado
no tenga que definir operaciones con el solo propósito de hacer
el recorrido más eficiente. Añadir nuevos recorridos se vuelve
difícil debido a que la interfaz del agregado tiene que cambiar
para permitir que otra clase sea amiga.
• Iteradores Nulos: un iterador nulo es un iterador degenerado
que es útil para manejar condiciones de borde. Por definición
un Iterador Nulo es siempre hecho. El Iterador Nulo hace
recorrer árboles y otras estructuras recursivas más fácil. A
cada punto en el recorrido el nodo actual es preguntado por el
iterador de su hijo. Un elemento del agregado retorna un
iterador concreto, una hoja devuelve el Iterador nulo
111
El Patrón Visitor: El Problema
Representa una operación a ser llevada a cabo en
los elementos de un objeto estructura. Los
visitantes permiten definir una nueva operación sin
cambiar las clases de los elementos en los cuales
opera.
• varias operaciones distintas y sin relación necesitan
ser llevadas a cabo en objetos en un objeto estructura y
no se quiere “ensuciar” las clases con estas
operaciones.
•Las clases que definen el objeto estructura son rara vez
cambiadas pero muchas veces se requiere definir
nuevas operaciones sobre la estructura.
112
113
114
115
Participantes de Patrón Visitante
(1)
• Contexto
– Declara una operación visitante para cada clase de
ElementoConcreto en el objeto estructura
– El nombre de la operación y la firma identifica la clase
que envía el requerimiento Visitante
• VisitanteConcreto
– Implementea cada operación declarada por Visitante
– Cada operación implementa un fragmento del algoritmo
para la correspondiente clase del objeto en el objeto
estructura
– Provee el contexto para el algoritmo y almacena su
estado (frecuentemente acumulando resultados
durante el recorrido)
• Elemento
– Define una operación de aceptación que toma un
visitante como argumento
116
Participantes y Colaboración de
Patrón Visitante (2)
• Elemento Concreto
– Implementa una operación de aceptación que toma un visitante
como un argumento
• ObjetoEstructura
– Puede enumerar los elementos
– Puede proveer una interfaz de alto nivel para permitir al visitante
visitar a sus elementos.
– Puede ser una composición o una colección tal como una lista o
un conjunto.
• Un cliente que usa el patrón visitante debe crear un objeto
VisitanteConcreto y recorrer el ObjetoEstructura visitando
cada elemento con el Visitante
• Cuando un elemento es visitado, llama a la operación
Visitante que corresponde a su clase. El elemento se
provee a si mismo como un argumento a esta operación
117
118
119
Consecuencias del Patrón
Visitante (1)
• + Hace añadir nuevas operaciones fácil: una nueva
operación es definida añadiendo un visitante (en
contraste, cuando se extiende la funcionalidad sobre
varias clases cada clase debe cambiar para definir una
nueva operación)
• + Reúne operaciones relacionadas y separa las no
relacionadas: comportamiento relacionado se localiza
en el visitante y no se dispersa sobre las clases que
definen el objeto estructura
• - Añadir nuevos ElementosConcretos es difícil: cada
nuevo ElementoConcreto da lugar a una nueva
operación abstracta en el Visitante y una
correspondiente implementación en cada
VisitanteConcreto
120
Consecuencias del Patrón
Visitante (2)
• + Permite visitante a través de jerarquía de clases: un iterador
puede también visitar elementos de una estructura de objetos
cuando los recorre y llama a las operaciones sobre ellos, pero
todos los elementos de la estructura de objetos necesitan tener un
padre común. Los Visitantes no tienen esta restricción
• + Acumulación de Estado: El visitante puede acumular estados al
proceder con el recorrido. Sin un visitante este estado debe ser
pasado como un parámetro extra a ser manejado en variables
globales
• - Rompe la encapsulación: El acercamiento del Visitante asume
que la interfaz del ElementoConcreto es lo suficientemente
poderosa como para permiter al visitante hacer su trabajo. Como
resultado el patrón muchas veces fuerza a proveer operaciones
públicas para acceder al estado interno del elemento lo cual
puede comprometer la encapsulación
121
Implementación del Patrón
Visitante
• Doble Despacho: un aspecto principal del visitante es el
doble despacho, el significado de una operación de
aceptación depende del visitante y del elemento. Los
lenguajes que soportan doble despacho (CLOS)
pueden hacer esto sin ningún patrón.
• ¿Quien es responsable por recorrer el objeto
estructura? La responsabilidad por recorrerlo pude
estar con:
– El objeto estructura
– El visitante: es recomendable cuando un recorrido complejo es
requerido (por ejemplo uno que dependa del resultado de la
operación), sino no es recomendable porque mucho del código
de recorrido debería ser duplicado en cada VisitanteConcreto
para cada agregado ElementoConcreto
– Un objeto iterador separado
122
TCP
Connection
(closed)
TCP
Connection
(listening)
El Patrón State: El Problema
Permite a un objeto cambiar su comportamiento
cuando cambia de estado interno. El objeto parece
como que ha cambiado su clase
TCP
Connection
(established)
•Objetos que implementan
protocolos de conexión reaccionan
diferente a los mismos mensajes
dependiendo si la conexión es
establecida o no.
•Un programa de dibujo interactivo
reacciona diferente a un click del
ratón dependiendo de la
herramienta que esta seleccionada
de una paleta.
123
Aplicabiliad y Solucón del Patrón
Estado
• El comportamiento de un objeto depende de su
estado y este debe cambiar en tiempo de
ejecución.
• Las operaciones tienen grandes condicionales
multiparte que dependen del estado del objeto.
• Varias operaciones contienen la misma estructura
condicional basada en uno o más constantes
enumeradas representando el estado en que esta
el objeto.
• El patrón de estado pone cada rama del
condicional en una clase diferente de tal manera
que un estado del objeto pude ser tratado como
un objeto en si mismo que pude variar
independientemente de otros objetos
124
Participantes del Patrón Estado
• Contexto
– Define la interfase de interés para los clientes
– Mantiene una instancia de algún EstadoConcreto que
define el estado actual
• Estado
– Define una interfase para encapsular el
comportamiento asociado con un estado particular del
Contexto
• Subclases de EstadoConcreto
– Cada subclase implementa un comportamiento
asociado con el estado del Contexto
125
Colaboraciones del Patrón Estado
• Contexto delega peticiones específicas para cada estado
para el actual objeto EstadoConcreto
• Un contexto puede pasarse a si mismo como un
argumento al objeto Estado que maneja la petición
permitiendo que el objeto Estado acceda al Contexto de
ser necesario.
• Contexto es la interfaz primaria para los clientes. Los
Clientes pueden configurar el contexto con objetos
Estados. Una vez que el contexto está configurado, el
cliente no tiene que tratar con el objeto Estado
directamente
• Ya sea el Contexto o las subclases del EstadoConcreto
pueden decidir que estado sigue a otro.
126
Consecuencias del Patrón Estado
• + Localiza el comportamiento específico para el estado y
particiona el comportamiento en diferentes estado de tal
manera que nuevos estados y transiciones pueden ser
añadidos fácilmente con solamente añadir una nueva
subclase de EstadoConcreto
• +/- Procedimientos largos conteniendo un sentencias
condicionales largas son evitadas, pero el número de
clases incremente y el todo es menos compacto que la
clase simple.
• + Hace las transiciones de estado explícita y protege el
contexto de inconsistencias internas debido a que la
actualización de estado es atómica.
• + Cuando el objeto Estado no necesita variables de
instancia pueden ser compartidos; son esencialmente
flyweights sin estado intrínseco y solo comportamiento.
127
Implementación del Patrón
Estado (1)
• ¿Quién define las transiciones de estado?
– Si el criterio para la transición de estado son fijos, pueden ser
implementados enteramente en el contexto.
– Es más flexible dejar las subclases de Estado especifiquen su
sucesor pero (1) cada subclase de estado debe conocer al
menos otra subclase de estado introduciendo dependencias
en la implementación entre las subclases (2) el Contexto debe
proveer una interfase para actualizar el estado actual
• Crear y Destruir el objeto Estado
– Crear objetos estado solo cuando son necesarios <=> crear
los objetos estados de forma previa y nunca destruirlos
– Depende de (1) cuando todos los posibles estados son
conocidos de ante mano (2) la cantidad de información que
tiene que ser almacenada en los objetos Estado (3) la
frecuencia con la cual un estado del Contexto cambia.
128
Implementación del Patrón
Estado (2)
• Alternativa basadas en una tabla
– Usar una tabla, mapear cada estado, cada posible entrada y el
estado siguiente
– Este acercamiento convierte el código del condicional en una
tabla de búsqueda y el cambio del criterio de transición es
hecho al cambiar los datos en la tabla en vez de cambiar el
código.
– Las desventajas son que (1) la tabla de búsqueda es menos
eficientes que una llamada a función (virtual) (2) la tabla
captura el estado y las transiciones pero necesita ser
aumentada para realizar cálculos arbitrarios en cada
transición.
• Usar herencia dinámica
– Los lenguajes que permiten cambiar la clase de un objeto en
tiempo de ejecución soportan el patrón estado directamente.
Solamente deje que el objeto cambie su clase cuando el
estado cambia y el comportamiento cambiará también.
129
El Patrón Strategy: El Problema
Definir una familia de algoritmos, encapsular cada
uno, y hacerlos intercambiables. Estrategia
permite que el algoritmo varíe independientemente
de los clientes que lo usan.
•Diferentes algoritmos de cambio
de línea en un editor
•Diferentes tipos de alocación de
memoria
•Algoritmos para colecciones de
clases
•Diferentes algoritmos para revisar
una entrada válida en diferente
tipos de cajas de diálogo.
person
age:
car
registrnr:
130
Aplicabilidad del Patrón Estrategia
• Varias clases diferentes difieren solamente en su
comportamiento; usando Estrategia provee una
manera de configurar una clase con uno o más
comportamientos.
• Muchas variantes diferentes de un algoritmo son
necesarias; usando Estrategia las variantes
pueden ser implementadas como una jerarquía de
clases de algoritmos.
• Los algoritmos usan datos que los clientes pueden
no conocer; usando Estrategia se evita exponer
datos complejos específicos del algoritmo.
131
Participantes del Patrón Estrategia
• Estrategia
– Declara una interfaz común a todos los algoritmos
soportados
– Contexto usa esta interfaz para llamar a los algoritmos
definidos por EstrategiaConcreta
• Subclases de EstrategiaConcreta
– Cada subclase implementa el algoritmo usando la
interfase Estrategia
• Contexto
– Es configurado como un objeto EstrategiConcreta
– Pude definir una interfaz que permite a Estrategia
acceder sus datos
132
Colaboraciones en el Patrón
Estrategia
• Un contexto envía requerimientos de sus clientes
a Estrategia
• Estrategia y Contexto interactúan para
implementar el algoritmo escogido
– Un Contexto puede pasar todo los datos requeridos por
el algoritmo a Estrategia cuando se llama al algoritmo.
– Contexto puede pasarse a si mismo como un
argumento a las operaciones de Estrategia de tal
menara que estas puedan llamarlo de vuelta si el
Contexto es requerido.
• Los clientes usualmente crean y pasan un objeto
EstrategiaConcreta al Contexto; de ahí los clientes
interactúan con el Contexto exclusivamente
133
Consecuencias del Patrón
Estrategia (1)
• + Las Jerarquías de las clases Estrategia definen una
familia de algoritmos o comportamientos para reusar.
La herencia puede factorizar la funcionalidad común de
estos algoritmos.
• + Es alternativo a subclase, Ej. Usar la jerarquía de
clases de contexto para implementar las variaciones en
el comportamiento. El comportamiento no esta fijo en
contesto así que el algoritmo pude variar
independientemente de Contexto.
• + Es una alternativa a usar sentencias condicionales
para seleccionar el comportamiento deseado
• + Puede ofrecer una elección de implementaciones
para el mismo comportamiento (Ej. Compromisos
espacio tiempo)
134
Consecuencias del Patrón
Estrategia (2)
• - Clientes deben estar consientes de las diferentes Estrategias.
Los clientes deben entender las diferencias entre lo que se ofrece
y ser capaces de seleccionar el apropiado. Por lo tanto el patrón
debería solo ser usado cuando la variación en algoritmo
(implementación) es relevante para el cliente.
• - Existe algo de sobrecarga en la comunicación entre la
Estrategia y el Contexto. Estrategia define una interfase
(general). Muchas de los algoritmos más simples no necesitan
toda la información que se envía.
• - El número de objetos en las aplicaciones aumenta Algunas
veces la sobrecarga puede ser reducida cuando
EstrategiasConcretas puede ser implementado por objetos sin
estado que pueden ser compartidos (Ej. El patrón flyweight)

Más contenido relacionado

Similar a 6070_TRECALDE_00288.ppt

6 arquitectura desoftware
6 arquitectura desoftware6 arquitectura desoftware
6 arquitectura desoftwaregaston6711
 
Implementación y adaptación de patrones de diseño
Implementación y adaptación de patrones de diseñoImplementación y adaptación de patrones de diseño
Implementación y adaptación de patrones de diseñoJu Pe
 
Patrones de diseño II
Patrones de diseño IIPatrones de diseño II
Patrones de diseño IIkaolong
 
Patrones de diseño - Andrés Dorado
Patrones de diseño - Andrés DoradoPatrones de diseño - Andrés Dorado
Patrones de diseño - Andrés Dorado2008PA2Info3
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño Ijjegonzalezf
 
Unidad 2 diseño orientado a objetos
Unidad 2 diseño orientado a objetosUnidad 2 diseño orientado a objetos
Unidad 2 diseño orientado a objetosRene Guaman-Quinche
 
Buider Patron de Diseño
Buider Patron de DiseñoBuider Patron de Diseño
Buider Patron de DiseñoMario Cabrera
 
Patrones de diseño - Henry Vallejo
Patrones de diseño - Henry VallejoPatrones de diseño - Henry Vallejo
Patrones de diseño - Henry Vallejo2008PA2Info3
 
Desarrollo basado en patrones
Desarrollo basado en patronesDesarrollo basado en patrones
Desarrollo basado en patronesMarvin Zumbado
 
Diseño de software y diseño orientado a objetos
Diseño de software y diseño orientado a objetosDiseño de software y diseño orientado a objetos
Diseño de software y diseño orientado a objetosFabiola Laguna
 
Fundamentos del análisis orientado a objetos
Fundamentos del análisis orientado a objetosFundamentos del análisis orientado a objetos
Fundamentos del análisis orientado a objetosEduardo Galindo
 
Patrones de diseño de GoF
Patrones de diseño de GoFPatrones de diseño de GoF
Patrones de diseño de GoFYaskelly Yedra
 
FUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon Koudsi
FUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon KoudsiFUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon Koudsi
FUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon KoudsiRaimonKoudsi
 
Arquitectura del desarrollo del software
Arquitectura del desarrollo del softwareArquitectura del desarrollo del software
Arquitectura del desarrollo del softwareJose Morales
 
Catalogo de patrones 0
Catalogo de patrones 0Catalogo de patrones 0
Catalogo de patrones 0Fabio Ruiz
 
diseno Componente3.ppt
diseno Componente3.pptdiseno Componente3.ppt
diseno Componente3.pptrafael405074
 

Similar a 6070_TRECALDE_00288.ppt (20)

6 arquitectura desoftware
6 arquitectura desoftware6 arquitectura desoftware
6 arquitectura desoftware
 
Implementación y adaptación de patrones de diseño
Implementación y adaptación de patrones de diseñoImplementación y adaptación de patrones de diseño
Implementación y adaptación de patrones de diseño
 
chuy
chuy chuy
chuy
 
Patrones de diseño II
Patrones de diseño IIPatrones de diseño II
Patrones de diseño II
 
Patrones de diseño - Andrés Dorado
Patrones de diseño - Andrés DoradoPatrones de diseño - Andrés Dorado
Patrones de diseño - Andrés Dorado
 
Patrones de diseño I
Patrones de diseño IPatrones de diseño I
Patrones de diseño I
 
Unidad 2 diseño orientado a objetos
Unidad 2 diseño orientado a objetosUnidad 2 diseño orientado a objetos
Unidad 2 diseño orientado a objetos
 
Buider Patron de Diseño
Buider Patron de DiseñoBuider Patron de Diseño
Buider Patron de Diseño
 
Metodologia para el proyecto
Metodologia para el proyectoMetodologia para el proyecto
Metodologia para el proyecto
 
Patrones de diseño - Henry Vallejo
Patrones de diseño - Henry VallejoPatrones de diseño - Henry Vallejo
Patrones de diseño - Henry Vallejo
 
Patrones de Diseño
Patrones de DiseñoPatrones de Diseño
Patrones de Diseño
 
Desarrollo basado en patrones
Desarrollo basado en patronesDesarrollo basado en patrones
Desarrollo basado en patrones
 
Diseño de software y diseño orientado a objetos
Diseño de software y diseño orientado a objetosDiseño de software y diseño orientado a objetos
Diseño de software y diseño orientado a objetos
 
Fundamentos del análisis orientado a objetos
Fundamentos del análisis orientado a objetosFundamentos del análisis orientado a objetos
Fundamentos del análisis orientado a objetos
 
Patrones de diseño de GoF
Patrones de diseño de GoFPatrones de diseño de GoF
Patrones de diseño de GoF
 
FUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon Koudsi
FUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon KoudsiFUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon Koudsi
FUNDAMENTOS Y MÉTODOS DE ANÁLISIS DE REQUERIMIENTOS Raimon Koudsi
 
Arquitectura del desarrollo del software
Arquitectura del desarrollo del softwareArquitectura del desarrollo del software
Arquitectura del desarrollo del software
 
Catalogo de patrones 0
Catalogo de patrones 0Catalogo de patrones 0
Catalogo de patrones 0
 
06 patrones
06 patrones06 patrones
06 patrones
 
diseno Componente3.ppt
diseno Componente3.pptdiseno Componente3.ppt
diseno Componente3.ppt
 

Último

Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdflauradbernals
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfisrael garcia
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdfedwinmelgarschlink2
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenajuniorcuellargomez
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfOscarBlas6
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenadanielaerazok
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAdanielaerazok
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webDecaunlz
 

Último (8)

Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdf
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalena
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdf
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalena
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la web
 

6070_TRECALDE_00288.ppt

  • 2. 2 • Una clase es un mecanismo para encapsulación. Engloba ciertos servicios proporcionados por los datos y comportamiento que es útil en el contexto de alguna aplicación. Una case simple es muy raramente la solución completa a un problema real. • Existe un cuerpo creciente de investigación para describir la manera en que las colecciones de clases trabajan juntas para la solución de problemas. Frameworks de aplicación y Patrones de diseño son dos ideas que se volvieron populares en este contexto. Patrones y Frameworks
  • 3. 3 Frameworks de Aplicación • Un framework de aplicación es un conjunto de clases que cooperan de manera cercana unas con otras y juntas crean un diseño reusable para una categoría general de problemas • A pesar de que se puede abstraer y discutir el diseño de los elementos que están detrás del framework, el framework mismo es un conjunto de clases específicas que están típicamente implementadas solo en una plataforma específica o en un conjunto limitado de plataformas. • Los frameworks dictan la estructura general y el comportamiento de la aplicación. Describen como las responsabilidades ser reparten entre los diferentes componentes y como estos componentes interactúan.
  • 4. 4 Un Framework como una Librería de Cabeza • En una aplicación tradicional el código específico de la aplicación define el flujo de ejecución a través del programa, invocando ocasionalmente código proporcionado por una librería. • Un framework revierte esta relación: el flujo de control es dictado por el framework y el creador de un nueva aplicación simplemente cambia algunos de los métodos invocados por el framework. • La herencia es frecuentemente utilizada como un mecanismo poderoso para lograr esto. Alternativamente, componentes específicos de la aplicación que obedecen una interfaz específica se pueden enchufar. ____ ___ _ ___
  • 5. 5 Ejemplo de Framework de Aplicación (1) • Frameworks de creación de GUI simplifican la creación de interfaces gráficas para sistemas de software. • Un framework de aplicación de GUI implementa el comportamiento esperado de una interfaz gráfica de usuario (ventanas, botones, menús, etc) • Una nueva aplicación es construida al especificar y arreglar los elementos necesarios (botones, menús, campos de texto, etc) y por redefinir ciertos métodos (repuestas al ratón y eventos de teclado.
  • 6. 6 Ejemplo de Framework de Aplicación (2) • Frameworks de simulación simplifican la creación de aplicaciones de simulación. • Un Framework de simulación provee clases de propósito general para manipular los diferentes tipos de objeto en una simulación • El corazón de un framework de simulación es un procedimiento que itera a través de una lista de objetos introducidos en la simulación, preguntándole a cada uno que se actualice a si mismo • El framework no conoce nada acerca de la aplicación específica en la que esta siendo usada: bolas de billar, peces en un tanque, conejos y lobos en un juego ecológico, etc.
  • 7. 7 Patrones de Diseño • Los patrones de diseño son un intento de coleccionar y catalogar las más pequeñas arquitecturas que son recurrentes en los sistemas OO. Un patrón de diseño típicamente captura la solución a un problema que ha sido observado en muchos sistemas. • Los patrones de diseño son más abstractos que un framework. Los frameworks son implementaciones parciales de (sub)sistemas, los patrones de diseño no tienen una implementación inmediata. • Los patrones de diseño son elementos arquitectónicos más pequeños que los frameworks, la mayoría de aplicaciones y frameworks usan varios patrones. • Los diseños de patrones son a un nivel arquitectónico lo mismo que las frases en los lenguajes de programación.
  • 8. 8 Tipos de Patrones de Diseño De Clase tratan de la relación estática entre las clases y subclases De Objeto trantan con la relación entre objetos que puede cambiar en tiempo de ejecución propósito Creación: Se preocupan del proceso de creación de un objeto Estructurales: Se preocupan de como las clases y objetos se componen para formar estructuras mas grandes. Comportamiento: Se preocupan con los algoritmos y la asignación de responsabilidades entre los objetos scope
  • 9. 9 Patrones de Diseño Creacionales • Abstraen el proceso de instanciación: – Encapsulan el conocimiento acerca de que clase concreta se usa – Esconde como las instancias de estas clases son creadas y unidas • Da gran cantidad de flexibilidad en que se crea, quien lo crea, como es creado, y cuando es creado. • Una patrón de clase creacional usa la herencia para variar la clase que es instanciada • Un patrón de objeto creacional delega la instanciación a otro objeto
  • 10. 10 Patrones de Diseño Estructural • Los patrones de diseño estructurales se preocupan de como las clases y objetos se unen para formar estructuras más grandes. • Un patrón de clase estructural usa la herencia para componer interfaces o implementación; la composición es fijada en tiempo de diseño • Un patrón de objeto estructural describe la manera de componer los objetos para crear nueva funcionalidad; la flexibilidad añadida a la composición de objetos viene de la agilidad de cambiar la composición en tiempo de ejecución
  • 11. 11 Patrones de Diseño de Comportamiento • Los patrones de diseño de comportamiento se preocupan acerca de los algoritmos y de la asignación de responsabilidades entre los objetos. • Los patrones de clase de comportamiento usan herencia para distribuir el comportamiento entre las clases • Los patrones de objeto de comportamiento usan la composición de objetos en vez de la herencia.; algunos describen como un grupo de objetos coopera para llevar a cabo una tarea que un objeto simple no puede ejecutar por si mismo; otros tratan acerca de la encapsulación de comportamiento en un objeto y la delegación de peticiones a él.
  • 12. 12 Resumen Patrones Creacionales • Singleton • Abstract factory • Factory Method • Prototype • Builder Patrones Estructurales • Composite • Façade • Proxy • Flyweight • Adapter • Bridge • Decorator Patrones de Comportamiento • Chain of Respons. • Command • Interpreter • Iterator • Mediator • Memento • Observer • State • Strategy • Template Method • Visitor
  • 13. 13 Los elementos de los Patrones de Diseño • Un nombre • El problema que intenta resolver – Incluye las condiciones para que el patrón sea aplicable • La solución al problema brindada por el patrón – Los elementos (clases objetos) involucrados, sus roles, responsabilidades, relaciones y colaboraciones – No un diseño o implementación concreta • Las consecuencias de aplicar el patrón – Compromiso entre tiempo y espacio – Problemas de implementación y lenguajes – Efectos en la flexibilidad, extensibilidad, portabilidad
  • 14. 14 El Patrón Observer: El Problema Sujeto Observadores Asume una relación uno a muchos entre objetos, donde uno cambia y los dependientes deben actualizarse -Diferentes tipos de GUI mostrando los mismos datos - Diferentes ventanas mostrando diferentes vistas de un mismo modelo. También conocido como: Dependants, Publish-Subscribe
  • 15. 15
  • 16. 16 Participantes del Patrón Observador • Sujeto: conoce sus observadores, provee una interfaz para añadir (subscribir) y eliminar (cancelar) observadores y provee un método notificar que llama a actualizar en todos los observadores • Observador: provee una interfase actualizar • SujetoConcreto: mantiene el estado relevante para la aplicación, provee métodos para obtener y setear ese estado, llama a notificar cuando el estado es cambiado • ObservadorConcreto: mantiene una referencia al sujeto concreto, guarda el estado que se mantiene consistente con el del sujeto e implementa la interfaz actualizar
  • 17. 17
  • 18. 18 La Colaboración en el Patrón Observer • El SujetoConcreto notifica a sus observadores cada vez que se produce un cambio que pueda volver el estado de los observadores inconsistente. • Después de ser informados de un cambio, el Observador Concreto puede preguntar al Sujeto acerca de la información concerniente a su estado y entonces reconciliar su propio estado con el del Sujeto. • El cambio en el SujetoConcreto pude ser iniciado o uno de los ObservadoresConcretos por algún otro objeto de la aplicación
  • 19. 19
  • 20. 20
  • 21. 21 Las Consecuencias del Patrón Observador • + Aparejamiento abstracto y mínimo entre el Sujeto y el Observador: El sujeto no conoce la clase concreta del observador, las clases sujetoconcreto y observadorconcreto pueden ser reusadas independientemente, los sujetos y observadores pueden incluso pertenecer a diferentes capas de abstracción del sistema • + Soporte para comunicación broadcast: la notificación enviada por el sujeto no necesita especificar un receptor, se transmitirá a todos las partes interesadas (subscritas) • - Actualizaciones no esperadas: los observadores no tienen conocimiento de la existencia de los demás, una pequeña operación pueda causar una cascada de actualizaciones innecesarias.
  • 22. 22 La implementación del patrón Observador (1) • Mapear los sujetos a sus observadores: El sujeto mantiene referencias explícitas a los observadores a los que debe notificar o una tabla de búsqueda es instalada; hay un compromiso entre tiempo y memoria. • Observar a más de un sujeto: pude ser necesario en algunas situaciones; la interface actualizar debe ser extendida para llevar registro del sujeto que esta enviando el mensaje de actualización, permitiendo al observador saber que sujeto debe examinar. • Quien dispara los cambios (quien llam a notificar): – Todas las operaciones en el sujeto llaman a notificar luego de cambiar el estado del sujeto. Operaciones consecutivas pueden causar actualizaciones consecutivas que pueden no ser necesarias y no es eficiente – Hacer llamadas a notificar es responsabilidad del cliente; esto es propenso a error
  • 23. 23 La implementación del patrón Observador (2) • Las referencias colgantes a sujetos borrados: borrar un sujeto no debe producir referencias colgantes en sus observadores; solamente borrar el observador no es tampoco, frecuentemente, una buena idea. Cuando se borra un Sujeto los Observadores deben ser notificados de tal manera que puedan resetear sus referencias al Sujeto. • Asegurarse que el Sujeto es consistente antes de llamar a notificar: los observadores preguntarán el nuevo estado del sujeto en su actualización; esta regla es fácilmente violada sin intención cuando la subclases de Sujeto llaman a operaciones heredadas • Especificar modificaciones de interés de manera explícita: la eficiencia en la actualización puede ser mejorada cuando los observadores se registran por eventos de interés solamente
  • 24. 24 La implementación del patrón Observador (2) • Evitar protocolos de actualización propios del observador, los modelos pull y push: – En el modelo push, el sujeto envía a sus observadores información detallada en que ha cambiado; la clase sujeto hace la asunción acerca de las necesidades del Observador. – En el modelo pull el Sujeto envía nada más que la información mínima de notificación y el Observador pregunta por los detalles de manera explícita; esto hace énfasis en la ignorancia del Sujeto de sus Observadores; puede ser ineficiente porque los Observadores deben acceder lo que ha cambiado sin ayuda. • Encapsula actualizaciones semánticamente complejas: instala un administrador explícito de cambio que maneja la relación Sujeto-Observador y define una estrategia particular de actualización
  • 25. 25
  • 26. 26 El Patrón Composite: El Problema Compone objetos en estructuras de árbol para representar jerarquías parte-todo y deja que los clientes traten a los objetos individuales y composiciones de manera uniforme - Una herramienta de dibujo que permite a los usuarios construir diagramas complejos a partir de elementos simples -Árboles con nodos heterogéneos, ej. El árbol de parsing de un programa
  • 27. 27
  • 28. 28
  • 29. 29 Participantes del patrón de composición • Componentes: declaran al interfaz para objetos en la composición, implementa el comportamiento por defecto para la interface común de todos los objetos, declara una interfaz para acceer y manejar los componentes hijo, opcionalmene define/implementa una interfaz para acceder al componente padre • Hoja: define el comportamiento para objetos primitivos de la composición • Composición: define el comportamiento para los componentes que tengan hijos, guarda los componentes hijos, implemente acceso a los hijos y administran las operaciones en la interfaz del componente • Cliente: manipula llos objetos en la composición a través de la interfaz componente • Client: manipulates objects in the composition through the component interface
  • 30. 30
  • 31. 31
  • 32. 32 Colaboración en el Patrón de Composición • Los clientes usan la interfaz de la clase componente para interactuar con los objetos de la composición • Si el receptor es una hoja, la petición es manejada directamente • Si el receptor es una composición la petición es usualmente enviada a los hijos componentes, algunas operaciones se pueden ejecutar antes y/o después de enviarla.
  • 33. 33 Las consecuencias del Patrón Composición • + Hace al cliente más simple: los clientes pueden tratar a las estructuras compuestas y a los individuos de manera uniforme, los clientes normalmente no necesitan saber y no les debería importar si están tratando con una hoja o una composición. • + Hace más fácil añadir un nuevo tipo de componentes: el código del cliente trabaja automáticamente con las composiciones u hojas recién definidas • - Puede volver al diseño muy general: la desventaja de hacer sencillo el añadir nuevos componentes es que eso dificulta restringir los componentes de una composición, algunas veces en la composición se desea solo cierto tipo de hijos. Con el patrón Composición no se pude confiar en que el sistema hará cumplir esto.
  • 34. 34 La implementación del Patrón Composición (1) • Referencias explícitas al padre: simplifica el recorrido y manejo de estructuras compuestas; son definidas mejor en la clase Componente; es esencial para mantener la invariabilidad de que todos los hijos de una composición tienen como padre a una composición que a su vez los tiene como hijos. • Compartición de componentes: puede ser útil por ejemplo para reducir los requerimientos de almacenamiento, pero puede llevar a ambigüedades cuando se requiera recorrer la estructura hacia arriba. • Maximizar la interface del componente: para lograr que los clientes no conozcan la clase de hoja o composición que estan usando., la clase componente debería definir tantas operaciones comunes en las clases Hoja y Composición como sea posible; esto entra en conflicto con el diseño de la jerarquía de clases que dice que una clase solo debe implementar las operaciones que tienen sentido en todas sus subclases. Se requiere cierta creatividad para encontrar buenas implementaciones por defecto ( ej. Hijos (hoja) = {})
  • 35. 35 La implementación del Patrón Composición (2) • El acceso a los hijos y el manejo de operaciones: definir la interfaz para el manejo de los hijos a nivel del componente da transparencia pero afecta la seguridad, los clientes pueden hacer cosas sin sentido tales como añadir o borrar una hoja, esto debe capturarse en una implementación estándar: no hacer nada o arrojar un error • Las variables de instancia mantienen a los hijos: comúnmente estas variables de instancia pertenecen donde las operaciones de acceso y manejo están, pero cuando están en la clase componente, se tiene un penalidad de espacio, ya que las Hojas nunca tienen hijos. • Borrar componentes: en los lenguajes sin recolección de basura es mejor hacer a la Composición de borrar a sus hijos: una excepción es cuando una objeto hoja es compartido.
  • 36. 36 La implementación del Patrón Composición (3) • La estructura de datos para guarda hijos: una variedad de estructuras de datos están disponibles: listas, árboles, arreglos, tablas has; la elección depende en la eficiencia; alternativamente cada hijo puede ser guardado en una variable de instancia separada; todas las operaciones de acceso y manejo deben entonces ser implementadas en cada subclase composición. • Ordenamiento de hijos: cuando el orden de los hijos es un problema, la interfaz de acceso y manejo de los hijos debe estar diseñada cuidadosamente para manipular esta secuencia • Caching: cuando la composición necesita ser recorrida o buscada frecuentemente la clase composición puede hacer caching de la información de sus hijos; los cambios a un componente requiere invalidad los caches de su padre.
  • 37. 37 El patrón Singleton: El Problema Asegura que una clase tiene exactamente una instancia y provee una punto global de acceso a ella. -Solo puede haber una cola de impresión, un sistema de archivos, un manejador de ventanas en una aplicación estándar - Existe solo un tablero de juego en monopolio, un laberinto en el juego de Pacman Monopoly Board : Monopoly Board : Monopoly Board
  • 38. 38 Participación y Colaboración en el Patrón Singleton Participante: • Singleton: – Es responsable por crear y almacenar su propia instancia única. – Define una operación Instancia que permite al los clientes acceder su única instancia Colaboración – La operación Instancia a nivel de clase retorna o crea una sola instancia; un atributo a nivel de clase contiene un valor por defecto indicando que no hay una instancia todavía o una sola instancia
  • 39. 39
  • 40. 40 Consecuencias del Patrón Singleton • + Acceso controlado a una sola instancia: debido a que el Singleton encapsula su sola instancia, tiene control estricto sobre ella. • + Reduce el espacio de nombres: es una mejora a polucionar el espacio de nombres con variables globales que contendrán instancias únicas • + Permite refinamiento de operaciones y representación: la clase Singleton puede tener subclases y la aplicación pude ser configurada con una instancia de la clases necesitada en tiempo de ejecución • + Permite un número variable de instancias: el mismo acercamiento puede ser usado para controlar el número de instancias que existen; una operación que de acceso a la instancia debe ser proveída • + Mas flexible que usar una clase con operaciones solamente.
  • 41. 41 La Implementación del Patrón Singleton • Asegurar una única instancia: – El constructor o operación new debe estar protegida o sobrescrita para evita que se creen otras instancias accidentalmente por código del usuario. • Subclases de la clase Singleton: – El principal problema es instalar una única instancia de un tipo deseado en tiempo de ejecución – Cuando todas las subclases son conocidas de antemano la operación Instancia puede ser un condicional y crear la instancia correcta dependiendo de algún parámetro y alimentación del usuario – Cuando las subclases no son conocidas de antemano un registro puede ser usado: todas las subclases se registran antes de instanciarse; la operación Instancia escoge la instancia correcta dependiendo de esto.
  • 42. 42 El patrón Abstract Factory: El Problema Provee una interfaz para crear familias de objetos relacionados o dependientes sin especificar su clase concreta -Un toolkit GUI que soporta múltiples visualizaciones - Lograr portabilidad a través de aplicaciones en diferentes sistemas de ventanas También llamada: Kit
  • 43. 43
  • 44. 44 Los participantes del Patrón de Fábrica Abstracta • AbstractFactory: declara una interfase para operaciones que crean objetos de productos abstractos • ConcreteFactory: implementa las operaciones para crear objetos de productos concretos • AbstractProduct: declara una interfase para un tipo de objeto producto • ConcreteProduct: define un objeto producto a ser creado por su correspondiente fábrica; implementa la interfase AbstractProduct • Cliente: usa sola interfaces declaradas por AbstractProduct y AbstractFactory
  • 45. 45
  • 46. 46
  • 47. 47 Colaboración en el Patrón de Fábrica Abstracta • AbstractFactory difiere la creación de los objetos productos a su subclase ConcreteFactory • Una instancia simple de ConcreteFactory es creada en tiempo de ejecución; esta fábrica concreta crea objetos producto que tienen una implementación dada
  • 48. 48 Consecuencias del Patrón Fábrica Abstracta (1) • + Clases concretas aisladas: la AbstractFactory encapsula la responsabilidad y el proceso de crear objetos producto, aísla al cliente de las clases con implementación; los clientes manipulan las instancias a través de sus interfaces abstractas; los nombres de las clases producto no aparecen en el código cliente. • + Hace fácil el intercambio de familias de productos: la clase ConcreteFactory aparece solamente una vez en la aplicación, esto es, donde es instanciada, así que es fácil de remplazar; dado que la fábrica abstracta crea una familia entera de productos, la familia completa pude cambiar de manera sencilla
  • 49. 49 Consecuencias del Patrón Fábrica Abstracta (2) • + Promueve la consistencia entre productos: cuando los productos en una familia son diseñados para trabajar juntos, es importante para la aplicación el usar los objeto de una sola familia; el patrón de fábrica abstracta hace fácil cumplir esto. • +- Soportar nuevos tipos de productos es difícil: extender las fábricas abstractas para producir una nueva clase de producto no es fácil porque el conjunto de los produtos que pueden ser creados es fija en la interface AbstractFactory; soportar nuevas clases de productos requiere extender la interfase lo que involucra cambiar la clase AbstractFactory y todas sus subclases
  • 50. 50 Implentación del Patrón Fábrica Abstracta (1) • Las fábricas son singletons: una aplicación necesita solamente una instancia de una fábrica concreta por familia de productos, así que es mejor implementarla como un singleton • Creando nuevos productos: – AbstractFactory solo declara una interfaz para crear productos, le corresponde a las subclases de ConcreteFactory crear verdaderamente los productos – La forma más común de hacer esto es usar un método-fábrica para cada producto; cada fábrica concreta especifica su producto al sobrescribir cada método-fábrica; es simple pero requiere una nueva fábrica concreta para cada producto en la familia, aun si solo difieren levemente. – Una alternativa es implementar las fábricas concretas con el patrón prototipo; la fábrica concreta es inicializada con una instancia prototípica de cada producto y crea nuevos productos por clonación
  • 51. 51 Implentación del Patrón Fábrica Abstracta (2) • Definir fábricas extensibles: – Un diseño más flexible pero menos seguro es proveer una fábrica abstracta con un función “hacer” que tome como parámetro el tipo de objeto a crear (como cadena o identificador de clase) – Es más fácil de realizar en un lenguaje dinámico que en uno estático por el tipo retornado por esta operación “hacer” – Puede ser usado en C++ solo si todos los objetos productos tienen una clase base común o si los objeto productos pueden ser coercionados en el tipo que el cliente que pida el producto requiera. En este último los productos retornados tienen todos la misma interfaz abstracta y el cliente no podra diferenciar o hacer asunciones acerca de la clase del producto
  • 52. 52 El Patrón Factory Method: El Problema Define una interfaz para crear un objeto pero deja que las subclases decidan que objeto instanciar - Cuando frameworks o toolkits uan clases abstractas para definir y manter relaciones entre objetos y son responsables de crear también los objetos Conocida también como : Virtual constructor
  • 53. 53
  • 54. 54
  • 55. 55 Participantes y Colaboración en el Patrón de la Método Fábrica • Producto: define la interfase de los objetos que el método fábrica crea • ProductoConcreto: implementa la interfase Producto • Creador – Declara el método fábrica, que retorna un objeto tipo Producto; pude definir una implementación por defecto – Puede llamar al método fábrica para crear objetos Producto • CreadorConcreto: sobrescribe el método fábrica para devolver una instancia de ProductoConcreto • El Creador se basa en sus subclases para definir el método fábrica que retorna una instancia de ProductoConcreto
  • 56. 56 Consecuencias del Patrón Método Fábrica • + Elimina la necesidad de unir clases específicas de la aplicación dentro de tu código • - Los clientes pueden tener que crear una subclase de Creador solo para crear un ProductoConcreto particular • + Provee ganchos para las subclases: el método fábrica da a las subclases un gancho para proveer una versión extendida de un objeto • + Conecta jerarquías paralelas de clases: un cliente puede usar un método fábrica para crear una jerarquía paralela de clases.
  • 57. 57 Implementación del Patrón Método Fábrica (1) • Existen dos variedades mayores: – (1) la clase Creador es una clase abstracta y no provee una implementación para el método fábrica que declara; las subclases son requeridas para proveer una implementación. – (2) la clase Creador es concreta y provee una valor por defecto para la implementación del método fábrica: le método fábrica solamente da flexibilidad a las subclases para crear diferentes objetos. – El método fábrica puede ser parametrizado con algo que identifica al objeto a crear (el cuerpo es entonces un condicional); sobrescribir un método fábrica parametrizado hace fácil selectivamente extender o cambiar los productos que son creados • Usar convención de nombres puede hacer claro que se esta usando métodos fábrica
  • 58. 58 Implementación del Patrón Método Fábrica (2) • En C++ – Los métodos fábrica son siempre métodos virtuales y son frecuentemente puramente virtuales – Se debe tener cuidado de no llamar al método fábrica en el el constructor del Creador porque el método fábrica en el CreadorConcreto no esta disponible todavía – Esto se pude evitar al acceder a productos solamente a través de operaciones de acceso que crean el producto bajo demanda; el constructor inicializa a 0, el accesor verifica y crea el producto si este no existe todavía (inicialización ociosa) • Usar plantillas para evitar las subclases: en vez de crear una subclases de Creador para cada ProductoConcreto, una plantilla subclase de Creador puede ser provista que esta parametrizada con la clase Producto
  • 59. 59 El Patrón Prototipo: El Problema Especificar las clases de objetos a crear usando una instancia prototípica y crear nuevas instancias al copiar el prototipo. - Cuando las aplicacioens necesitan la flexibilidad de ser capaces de especificar la clase a instanciar en tiempo de ejecución - Cuando las instancias de una clase tienen solamente pocas combinaciones de estado
  • 60. 60 Participantes y Colaboraciones en el Patrón Prototipo • Prototipo: declara una interfaz para clonarse a si mismo • PrototipoConcreto: implementa una operación para clonarse a si mismo • Cliente: crea un nuevo objeto al pedir al prototipo que se clone a si mismo • El Cliente pide al Prototipo que se clone a si mismo
  • 61. 61
  • 62. 62
  • 63. 63 Consecuencias del Patrón Prototipo (1) • + Esconde del cliente las clases concretas del productos: El cliente puede trabajar con las clases específicas de la aplicación sin necesidad de modificarlas. • + Los productos pueden ser añadidos y removidos en tiempo de ejecución: nuevos productos concretos pueden ser incorporados solo registrándolos con el cliente • + Especificar nuevos objetos por valores cambiantes: nuevas clases de objetos pueden ser efectivamente definidos al instanciar una clase específica, llenar algunas de sus variables de instancia y registrarla como un prototipo • + Especificar nuevos objetos por una estructura variante: estructuras complejas definidas por el usuario pueden ser registradas como prototipos también y ser usads una y otra vez al clonarlas
  • 64. 64 Consecuencias del Patrón Prototipo (2) • + Reduce las subclases: al contrario que el Método Fábrica, que a menudo produce una jerarquía de clase creadora que asemeja al jerarquía de ProductosConcretos • + Configura una aplicación con clases dinámicamente: cuando el ambiente de tiempo de ejecución soporta carga dinámica de clases, el patrón de prototipo es una llave para explotar esas facilidades en un lenguaje estático (los constructores de las clases cargadas dinámicamente no pueden ser accesadas de manera estática; en vez de esto el ambiente de tiempo de ejecución crea automáticamente una instancia del prototipo que la aplicación puede usar a través del manejador de prototipos) • - Implementar la operación Clonar: es difícil cuando las clases en construcción existen o cuando internamente se incluye objetos que no soportan la copia o tiene referencias circulares
  • 65. 65 Implementación del Patrón Prototipo • Usar un manejador de prototipos: cuando el número de prototipos en un sistema no es fijo, es mejor usar un registro de los prototipos existentes • Implementar la operación clonación: muchos lenguajes dan soporte a la implementación del operador clonación (constructores de copia en C++, método copy en Smalltalk, guardar + cargar en sistemas que lo soportan) pero en si mismos no solucionan el problema de la copia superficial / profunda • Inicializar clones: algunos clientes son felices con el clone como esta, otros desean inicializarlo; pasando parámetros a la operación clonar elimina la uniformidad de la interfase. Hay que utilizar las operaciones de cambio de estado luego de la clonación o proveer un método Inicializar • En lenguajes que tratan a las clases como objetos de primera clase, el objeto clase en si mismo es como el prototipo para crear instancias de cada clase
  • 66. 66 Title Hello you! El Patrón Builder Pattern: El Problema Separar la construcción de un objeto complejo de su representación de tal manera que el mismo proceso de construcción pueda crear diferentes representaciones - Un lector RTF que puede convertir en varios formatos - Un parser que produce un árbol de parsing complejo Title Hello you! <B><FONT FACE="Arial" SIZE=6><P>Title</P> </B></FONT><FONT FACE="Times"> </FONT><I><FONT FACE="Arial"><P>Hello you!</P></I></FONT></BODY> </HTML> Save-as command of Word
  • 67. 67
  • 68. 68 Participantes del Patrón Constructor • Constructor: especifica una interfaz abstracta para crear partes de un Producto • ConstructorConcreto: – Construye y ensambla las partes de un Producto al implementar la interfase Constructor – Define y sigue la pista de la representación que crea – Provee una interfase para recuperar el producto • Director: construye un objeto usando la interfaz del Constructor • Producto: – Representa el objeto complejo en construcción – Incluye clases que definen las partes constituyentes incluyendo las interfaces para ensamblar las partes en un resultado final
  • 69. 69
  • 70. 70 Colaboración en el Patrón Constructor • El cliente crea al objeto Director y lo configura con el objeto Constructor deseado. • El Director notifica al constructor que parte del producto debe ser construida • El constructor maneja los requerimientos del director y añada partes al producto • El cliente recupera el producto del constructor
  • 71. 71
  • 72. 72 Consecuencias del Patrón Constructor • + Permite variar la representación interna del producto: los directores usan la interfaz abstracta provista por el constructor para construir el producto; para cambiar la representación del producto, solo se debe hacer un nuevo tipo de constructor. • + Permite el reuso de los Constructores Concretos: todo el código para la construcción y representación esta encapsulado; diferentes directores usan el mismo Constructor Concreto • + Da un control más fino sobre el proceso de construcción: En otros patrones creacionales, la construcción se realiza en un solo paso; aquí el producto es construido paso a paso y bajo la guía del director dando un control más fino sobre la estructura interna del producto resultante
  • 73. 73 Implementación del Patrón Constructor • Interfaces de Ensamblaje y Construcción: – La interfaz del Constructor debe ser generalmente suficiente para permitir la construcción de productos de toda clase de Constructores Concretos – El modelo para la construcción y ensamblaje es una decisión importante del diseño • ¿Por qué no clases abstractas para los productos?: – En el caso común, los productos pueden diferir tanto en sus representaciones que se gana muy poco dando a todos los productos una clase padre común. – Debido a que el cliente configura al Director con el Constructor Concreto adecuado, el cliente conoce el producto resultante. • Métodos vacíos como valor por defecto en el Constructor – En C++ los métodos para construir son intencionalmente no puramente virtuales sino métodos vacíos; esto permite al cliente sobrescribir solamente las operaciones en las cual está interesado.
  • 74. 74 El Patrón Façade: El Problema Provee una interfaz unificada de alto nivel a un grupo de interfaces en un subsistema para hacer que el subsistema sea más fácil de usar. •Provee una interfaz simple a un subsistema complejo •Desacopla un subsistema de sus clientes y otros subsistemas •Crea capas de subsistemas al proveer una interfaz para cada nivel del subsistema. facade Clases Cliente Clases Subsistema
  • 75. 75
  • 76. 76
  • 77. 77 Participantes y Colaboración del Patrón Fachada • Fachada: – Sabe que clases del subsistemas son responsables para cada petición – Delega las peticiones de los clientes a los subsistemas apropiados • Clases del Subsistema – Implementan la funcionalidad del subsistema – Manejan el trabajo asignado por el objeto Fachada – No tienen conocimiento del objeto Fachada. Ej.: no mantienen una referencia a él. • Los clientes envía su petición a Fachada la que a su vez se lo envía al objeto apropiado en el subsistema
  • 78. 78
  • 79. 79 Consecuencias del Patrón Fachada • + Escuda a los clientes de los componentes del subsistema reduciendo el número de objetos con que los clientes tienen que trabajar, haciendo al subsistema más fácil de usar • + Promueve el aparejamiento débil entre el subsistema y sus clientes, permitiendo que los componentes del subsistema cambien sin afectar a los clientes. • + Reduce las dependencias de compilación en sistemas grandes de software • + No previene que las aplicaciones usen las clases del subsistemas si así lo necesitaren
  • 80. 80 Implementación del Patrón Fachada • El aparejamiento entre clientes y subsistemas puede ser reducido aún más: – Al hacer Fachada una clase abstracta con subclases concretas para diferentes implementaciones de un subsistema; este aparejamiento abstracto evita que los clientes conozcan la implementación de un subsistema que están usando. – Al configurar el objeto fachada con diferentes objetos subsistema; para personalizar simplemente remplace uno o más objetos subsistema • Clases del subsistemas Publicas vs. Privadas: la fachada es parte de la interfaz pública de un subsitema, junto con las clases del subsistema a las que algunos cliente acceden directamente (muy pocos lenguajes OO soportan la noción de clases de subsistema privado a pesar de que sería una características muy útil.
  • 81. 81 El Patrón del Proxy: el Problema Provee un subrogante de otro objeto para controlar el acceso a este. • un proxy remoto provee una representación local de un objeto en un espacio de direcciones diferente •Un proxy virtual crea objejos caros bajo demanda •Un proxy de protección controla el acceso al objeto original y es útil cuando los objetos tiene diferentes derechos de acceso. •Una referencia inteligente es un remplazo de un puntero que realiza acciones adicionales cuando un objeto es accesado. Ej. Contar referencias proxy Clase Cliente Clase Real
  • 82. 82
  • 83. 83
  • 84. 84 Participantes del Patrón Proxy (1) • Proxy: – Mantiene una referencia que permite al proxy acceder al sujeto real – Provee una interfase idéntica a la del Sujeto de tal manera que el proxy puede sustituir al objeto real – Controla el acceso al sujeto real y puede ser responsable de su creación y borrado. – Los Proxies remotos son responsables por la codificación de un requerimiento y sus argumentos y por enviar el requerimiento al sujeto real en otro espacio de direcciones. – Los proxies Virtuales pueden guardar información acerca del sujeto real de tal manera que puede posponer el acceso a él. – Los proxies de protección verifica que el que llama tiene acceso y permiso para llevar a cabo la petición
  • 85. 85
  • 86. 86 Participantes y Colaboración del Patrón Proxy (2) • Sujeto: – Define una interfaz común para el SujetoReal y Proxy, de tal manera que el Proxy puede ser usado en cualquier lugar donde se pida un SujetoReal • SujetoReal – Define el objeto real que el proxy representa • El Proxy envia la petición al SujetoReal cuando es apropiado (depende del tipo de proxy)
  • 87. 87
  • 88. 88 Consecuencias de Patrón Proxy • + El patrón Proxy introduce un nivel de indirección cuando se accede al objeto. Esta indirección tiene varios usos: – Un proxy remoto puede esconder el hecho de que un objeto reside en un espacio de direcciones diferente – Un proxy virtual puede ejecutar optimizaciones – Tanto el proxy de protección como los punteros inteligentes permiten mantenimiento adicional • + El patrón de proxy puede ser usado para implementar “copia-al-escbir” : para evitar copiar innecesariamente objetos granes, el sujeto real es referenciado; los requerimientos de cada copia incrementan este contador, pero solo cuando un cliente pide una operación que modifica al sujeto, el proxy lo copia.
  • 89. 89 Patrón Flyweight Pattern: El Problema Algunas aplicaciones se benefician del uso de objetos en su diseño,pero implementaciones simples son prohibitivamente caras por el gran número de objetos • Use un objeto para cada caracter en el texto en el editor de texto •Use un objeto posiciòn para cada elemento del GUI h a l l o Column a Fila Caracter
  • 90. 90
  • 91. 91
  • 92. 92
  • 93. 93
  • 94. 94 Aplicabilidad del Patrón PesoMosca • Aplicar pesomosca si Todo lo siguiente es verdad: – Una aplicación usa un número grande de objetos – El costo de almacenar es alto debido a la cantidad de objetos – La mayoría de los objetos puede ser hecho intrinseco – Most objects can be made extrinsic – Muchos grupos de objetos pueden ser remplazados con relativamente pocos objetos compartidos una vez que su estado extrínseco es removido. – Las aplicaciones no dependen de la identidad del objeto
  • 95. 95 Participantes del Patrón PesoMosca (1) • Flyweight – Declara una interfase a través de la cual flyweights pueden recibir y actuar según su estado extrínseco • Concrete Flyweight – Implementa la interfaz del flyweight y añade almacenamiento para el estado intrínseco. – Un objeto flyweight concreto debe ser compartible; Ej. Dos estado debe ser intrínsico • Unshared Concrete Flyweight – No todos las subclases flyweights necesitan ser compartidas, flyweight concretos no compartidos pueden tener objetos flyweight concretos a algún nivel.
  • 96. 96 Participantes del Patrón PesoMosca (2) • Fábrica Flyweight – Crea y maneja objetos flyweight – Asegura que los flyweights son compartidos adecuadamente; cuando un cliente pide un flyweight la fábrica flyweight devuelve un objeto existen de un repositorio o crea uno y lo añade al repositorio • Cliente – Mantiene una referencia hacia el o los flyweights – Calcula o guarda el estado extrínseco de los flyweights
  • 97. 97
  • 98. 98 Colaboraciones del Patrón PesoMosca • El estado que un flyweight necesita para funcionar debe ser caracterizado como intrínseco o extrínseco. El estado intrínseco es guardado en el objeto flyweight concreto; el extrínseco esta guardado o computado por los objetos clientes. El cliente pasa este estado al flyweight cuando invoca operaciones. • Los clientes no deben instanciar los flyweights concretos directamente. El cliente debe obtener los objetos flyweight concretos exclusivamente de la fábrica de flyweight para asegurar que se compartan adecuadamente
  • 99. 99
  • 100. 100 Consecuencias del Patrón PesoMosca • - Los Flyweights pueden introducir costos en tiempo de ejecución asociados con la transferencia, búsqueda, y/o cálculo del estado extrínseco. • + El incremento de los costos de tiempo de ejecución son compensados por ahorros de almacenamiento, el cual decrece – Tanto cuanto más flyweights son compartidos – Tanto cuanto la cantidad de estado intrínseco sea considerable – Tanto cuanto la cantidad de estado extrínseco es considerable pero puede ser calculado. • - El patrón flyweight se combina con el patrón composición para construir un grafo con varios nodos hoja. Debido a la compartición los nodos hojas no pueden guardar a su padre lo cual ocasiona un impacto mayor en como los objetos de la jerarquía se comunican.
  • 101. 101 Implementación del Patrón PesoMosca • Remover el estado extrínseco: – Identificar el estado extrínseco y removerlo de los objetos compartidos – Remover el estado extrínseco no ayudará si hay tantas clase de estados extrínsecos como objetos antes de compartir. – Idealmente el estado extrínseco pude ser calculado desde un objeto estructura separado con menos requerimientos de memoria. • Manejando objetos compartidos: – Use un almacenaje asociativo con la fábrica flyweight para dejar que los clientes encuentren un flyweight particular – Una forma de cuenta de referencia o de colección de basura es necesaria para recuperar el almacenamiento de los flyweights cuando estos ya no se usen – Cuando el número de flyweights es pequeño y fijo, considere inicializar el repositorio y mantener a los flyweights permanentemente
  • 102. 102 First Next IsDone? CurrentItem El Patrón Iterador: El Problema Provee una manera de acceder a elementos en un objeto agregado secuencialmente sin exponer la representación Interna • Soporta múltiples tipso de recorridos de objetos agregados • Provee una interfaz uniforme para recorrer estructuras agregadas (iteración polimórfica) ( a b c d e) a b c d e a b d c e
  • 103. 103
  • 104. 104 Participantes y Colaboración del Patrón Iterador • Iterador – Define una interfaz para acceder y recorrer elementos • IteradorConcreto – Implementa la interfaz iterador – Mantiene la pista de la posición actual en el recorrido del agregado. • Agregado – Define una interfase para definir un objeto Iterador • AgregadoConcreto – Implementa la interfaz de creación de un iterador para retornar una instancia del propio IteradorConcreto • Un IteradorConcreto mantiene la pista del objeto actual en el agregado y puede calcular el siguiente objeto en el recorrido.
  • 105. 105
  • 106. 106
  • 107. 107 Consecuencias del Patrón Iterador • + Soporta la variación en el recorrido de un agregado: agregados complejos pueden ser recorridos de diferentes maneras, los iteradores hacen fácil cambiar el algoritmo de recorrido solamente usando una instancia diferente de iterador. • + Simplifica la interfaz del agregado: La interfaz agregado no esta obstaculizada por el soporte de varios tipos de recorrido. • + Más de un recorrido puede estar pendiente en el mismo agregado: un iterador mantiene registro de su propio estado de recorrido, por lo tanto más de un recorrido puede estar en progreso al mismo tiempo.
  • 108. 108 Implementación del Patrón Iterador (1) • ¿Quién controla el iterador? Un iterador interno tiene control absoluto sobre la iteración completa, los clientes entregan una operación a ser realizar y el iterador aplica esa operación a cada uno de los elementos del agregado. Con un iterador externo, el cliente controla la iteracción. Ej.: el cliente avanza el recorrido al pedir el siguiente ítem explícitamente. Los iteradores externos son más flexibles (comparar dos coleccíones es practicamente imposible. Los iteradores internos son más fáciles de usar pero son más débiles en lenguajes que no soportan objetos como primera clase. • ¿Quién define el algoritmo de recorrido? El iterador puede ser responsable del algoritmo de recorrido en dicho caso es fácil usar diferentes algoritmos de recorrido en el mismo agregado y usar el mismo algoritmo en agregados diferentes. El agregado en si mismo puede ser responsable de el algoritmo de recorrido y el iterador solo guara el estado de la iteración (cursor)
  • 109. 109 Implementación del Patrón Iterador (2) • ¿Cuan robusto es el iterador? Un iterador robusto asegura que la inserción y remoción no interfieren con el recorrido (y lo hace si no se copia el agregado). Los iteradores robustos pueden por ejemplo ser implementados a través de registrar los iteradores con el agregado y hacer que el agregado ajuste el estado interno de los iteradores después de una inserción o borrado de elementos. • Iteradores Polimórficos en C++ tiene un costo, requieren que el objeto iterador sea asociado dinámicamente por el método fábrica. Por esto si no hay necesidad de polimorfismo use iteradores concretos los cuales pueden ser alojados en la pila. Los iteradores polimórficos tienen otro problema, deben ser eliminados por el código cliente, lo cual es propenso a errores. El patrón proxy ofrece una solución. Usar la pila para alojar el proxy del iterador real, hacer que el proxy asegure eliminar el iterador al borrarse, de tal manera que cuando el proxy se destruya, también lo hace el objeto iterador.
  • 110. 110 Implementación del Patrón Iterador (3) • Los iteradores pueden tener privilegios de acceso: un iterador pude ser visto como una extensión del agregado que lo crea. El iterador y el agregado están fuertemente aparejados. En C++ pueden ser hechos amigos de tal manera que el agregado no tenga que definir operaciones con el solo propósito de hacer el recorrido más eficiente. Añadir nuevos recorridos se vuelve difícil debido a que la interfaz del agregado tiene que cambiar para permitir que otra clase sea amiga. • Iteradores Nulos: un iterador nulo es un iterador degenerado que es útil para manejar condiciones de borde. Por definición un Iterador Nulo es siempre hecho. El Iterador Nulo hace recorrer árboles y otras estructuras recursivas más fácil. A cada punto en el recorrido el nodo actual es preguntado por el iterador de su hijo. Un elemento del agregado retorna un iterador concreto, una hoja devuelve el Iterador nulo
  • 111. 111 El Patrón Visitor: El Problema Representa una operación a ser llevada a cabo en los elementos de un objeto estructura. Los visitantes permiten definir una nueva operación sin cambiar las clases de los elementos en los cuales opera. • varias operaciones distintas y sin relación necesitan ser llevadas a cabo en objetos en un objeto estructura y no se quiere “ensuciar” las clases con estas operaciones. •Las clases que definen el objeto estructura son rara vez cambiadas pero muchas veces se requiere definir nuevas operaciones sobre la estructura.
  • 112. 112
  • 113. 113
  • 114. 114
  • 115. 115 Participantes de Patrón Visitante (1) • Contexto – Declara una operación visitante para cada clase de ElementoConcreto en el objeto estructura – El nombre de la operación y la firma identifica la clase que envía el requerimiento Visitante • VisitanteConcreto – Implementea cada operación declarada por Visitante – Cada operación implementa un fragmento del algoritmo para la correspondiente clase del objeto en el objeto estructura – Provee el contexto para el algoritmo y almacena su estado (frecuentemente acumulando resultados durante el recorrido) • Elemento – Define una operación de aceptación que toma un visitante como argumento
  • 116. 116 Participantes y Colaboración de Patrón Visitante (2) • Elemento Concreto – Implementa una operación de aceptación que toma un visitante como un argumento • ObjetoEstructura – Puede enumerar los elementos – Puede proveer una interfaz de alto nivel para permitir al visitante visitar a sus elementos. – Puede ser una composición o una colección tal como una lista o un conjunto. • Un cliente que usa el patrón visitante debe crear un objeto VisitanteConcreto y recorrer el ObjetoEstructura visitando cada elemento con el Visitante • Cuando un elemento es visitado, llama a la operación Visitante que corresponde a su clase. El elemento se provee a si mismo como un argumento a esta operación
  • 117. 117
  • 118. 118
  • 119. 119 Consecuencias del Patrón Visitante (1) • + Hace añadir nuevas operaciones fácil: una nueva operación es definida añadiendo un visitante (en contraste, cuando se extiende la funcionalidad sobre varias clases cada clase debe cambiar para definir una nueva operación) • + Reúne operaciones relacionadas y separa las no relacionadas: comportamiento relacionado se localiza en el visitante y no se dispersa sobre las clases que definen el objeto estructura • - Añadir nuevos ElementosConcretos es difícil: cada nuevo ElementoConcreto da lugar a una nueva operación abstracta en el Visitante y una correspondiente implementación en cada VisitanteConcreto
  • 120. 120 Consecuencias del Patrón Visitante (2) • + Permite visitante a través de jerarquía de clases: un iterador puede también visitar elementos de una estructura de objetos cuando los recorre y llama a las operaciones sobre ellos, pero todos los elementos de la estructura de objetos necesitan tener un padre común. Los Visitantes no tienen esta restricción • + Acumulación de Estado: El visitante puede acumular estados al proceder con el recorrido. Sin un visitante este estado debe ser pasado como un parámetro extra a ser manejado en variables globales • - Rompe la encapsulación: El acercamiento del Visitante asume que la interfaz del ElementoConcreto es lo suficientemente poderosa como para permiter al visitante hacer su trabajo. Como resultado el patrón muchas veces fuerza a proveer operaciones públicas para acceder al estado interno del elemento lo cual puede comprometer la encapsulación
  • 121. 121 Implementación del Patrón Visitante • Doble Despacho: un aspecto principal del visitante es el doble despacho, el significado de una operación de aceptación depende del visitante y del elemento. Los lenguajes que soportan doble despacho (CLOS) pueden hacer esto sin ningún patrón. • ¿Quien es responsable por recorrer el objeto estructura? La responsabilidad por recorrerlo pude estar con: – El objeto estructura – El visitante: es recomendable cuando un recorrido complejo es requerido (por ejemplo uno que dependa del resultado de la operación), sino no es recomendable porque mucho del código de recorrido debería ser duplicado en cada VisitanteConcreto para cada agregado ElementoConcreto – Un objeto iterador separado
  • 122. 122 TCP Connection (closed) TCP Connection (listening) El Patrón State: El Problema Permite a un objeto cambiar su comportamiento cuando cambia de estado interno. El objeto parece como que ha cambiado su clase TCP Connection (established) •Objetos que implementan protocolos de conexión reaccionan diferente a los mismos mensajes dependiendo si la conexión es establecida o no. •Un programa de dibujo interactivo reacciona diferente a un click del ratón dependiendo de la herramienta que esta seleccionada de una paleta.
  • 123. 123 Aplicabiliad y Solucón del Patrón Estado • El comportamiento de un objeto depende de su estado y este debe cambiar en tiempo de ejecución. • Las operaciones tienen grandes condicionales multiparte que dependen del estado del objeto. • Varias operaciones contienen la misma estructura condicional basada en uno o más constantes enumeradas representando el estado en que esta el objeto. • El patrón de estado pone cada rama del condicional en una clase diferente de tal manera que un estado del objeto pude ser tratado como un objeto en si mismo que pude variar independientemente de otros objetos
  • 124. 124 Participantes del Patrón Estado • Contexto – Define la interfase de interés para los clientes – Mantiene una instancia de algún EstadoConcreto que define el estado actual • Estado – Define una interfase para encapsular el comportamiento asociado con un estado particular del Contexto • Subclases de EstadoConcreto – Cada subclase implementa un comportamiento asociado con el estado del Contexto
  • 125. 125 Colaboraciones del Patrón Estado • Contexto delega peticiones específicas para cada estado para el actual objeto EstadoConcreto • Un contexto puede pasarse a si mismo como un argumento al objeto Estado que maneja la petición permitiendo que el objeto Estado acceda al Contexto de ser necesario. • Contexto es la interfaz primaria para los clientes. Los Clientes pueden configurar el contexto con objetos Estados. Una vez que el contexto está configurado, el cliente no tiene que tratar con el objeto Estado directamente • Ya sea el Contexto o las subclases del EstadoConcreto pueden decidir que estado sigue a otro.
  • 126. 126 Consecuencias del Patrón Estado • + Localiza el comportamiento específico para el estado y particiona el comportamiento en diferentes estado de tal manera que nuevos estados y transiciones pueden ser añadidos fácilmente con solamente añadir una nueva subclase de EstadoConcreto • +/- Procedimientos largos conteniendo un sentencias condicionales largas son evitadas, pero el número de clases incremente y el todo es menos compacto que la clase simple. • + Hace las transiciones de estado explícita y protege el contexto de inconsistencias internas debido a que la actualización de estado es atómica. • + Cuando el objeto Estado no necesita variables de instancia pueden ser compartidos; son esencialmente flyweights sin estado intrínseco y solo comportamiento.
  • 127. 127 Implementación del Patrón Estado (1) • ¿Quién define las transiciones de estado? – Si el criterio para la transición de estado son fijos, pueden ser implementados enteramente en el contexto. – Es más flexible dejar las subclases de Estado especifiquen su sucesor pero (1) cada subclase de estado debe conocer al menos otra subclase de estado introduciendo dependencias en la implementación entre las subclases (2) el Contexto debe proveer una interfase para actualizar el estado actual • Crear y Destruir el objeto Estado – Crear objetos estado solo cuando son necesarios <=> crear los objetos estados de forma previa y nunca destruirlos – Depende de (1) cuando todos los posibles estados son conocidos de ante mano (2) la cantidad de información que tiene que ser almacenada en los objetos Estado (3) la frecuencia con la cual un estado del Contexto cambia.
  • 128. 128 Implementación del Patrón Estado (2) • Alternativa basadas en una tabla – Usar una tabla, mapear cada estado, cada posible entrada y el estado siguiente – Este acercamiento convierte el código del condicional en una tabla de búsqueda y el cambio del criterio de transición es hecho al cambiar los datos en la tabla en vez de cambiar el código. – Las desventajas son que (1) la tabla de búsqueda es menos eficientes que una llamada a función (virtual) (2) la tabla captura el estado y las transiciones pero necesita ser aumentada para realizar cálculos arbitrarios en cada transición. • Usar herencia dinámica – Los lenguajes que permiten cambiar la clase de un objeto en tiempo de ejecución soportan el patrón estado directamente. Solamente deje que el objeto cambie su clase cuando el estado cambia y el comportamiento cambiará también.
  • 129. 129 El Patrón Strategy: El Problema Definir una familia de algoritmos, encapsular cada uno, y hacerlos intercambiables. Estrategia permite que el algoritmo varíe independientemente de los clientes que lo usan. •Diferentes algoritmos de cambio de línea en un editor •Diferentes tipos de alocación de memoria •Algoritmos para colecciones de clases •Diferentes algoritmos para revisar una entrada válida en diferente tipos de cajas de diálogo. person age: car registrnr:
  • 130. 130 Aplicabilidad del Patrón Estrategia • Varias clases diferentes difieren solamente en su comportamiento; usando Estrategia provee una manera de configurar una clase con uno o más comportamientos. • Muchas variantes diferentes de un algoritmo son necesarias; usando Estrategia las variantes pueden ser implementadas como una jerarquía de clases de algoritmos. • Los algoritmos usan datos que los clientes pueden no conocer; usando Estrategia se evita exponer datos complejos específicos del algoritmo.
  • 131. 131 Participantes del Patrón Estrategia • Estrategia – Declara una interfaz común a todos los algoritmos soportados – Contexto usa esta interfaz para llamar a los algoritmos definidos por EstrategiaConcreta • Subclases de EstrategiaConcreta – Cada subclase implementa el algoritmo usando la interfase Estrategia • Contexto – Es configurado como un objeto EstrategiConcreta – Pude definir una interfaz que permite a Estrategia acceder sus datos
  • 132. 132 Colaboraciones en el Patrón Estrategia • Un contexto envía requerimientos de sus clientes a Estrategia • Estrategia y Contexto interactúan para implementar el algoritmo escogido – Un Contexto puede pasar todo los datos requeridos por el algoritmo a Estrategia cuando se llama al algoritmo. – Contexto puede pasarse a si mismo como un argumento a las operaciones de Estrategia de tal menara que estas puedan llamarlo de vuelta si el Contexto es requerido. • Los clientes usualmente crean y pasan un objeto EstrategiaConcreta al Contexto; de ahí los clientes interactúan con el Contexto exclusivamente
  • 133. 133 Consecuencias del Patrón Estrategia (1) • + Las Jerarquías de las clases Estrategia definen una familia de algoritmos o comportamientos para reusar. La herencia puede factorizar la funcionalidad común de estos algoritmos. • + Es alternativo a subclase, Ej. Usar la jerarquía de clases de contexto para implementar las variaciones en el comportamiento. El comportamiento no esta fijo en contesto así que el algoritmo pude variar independientemente de Contexto. • + Es una alternativa a usar sentencias condicionales para seleccionar el comportamiento deseado • + Puede ofrecer una elección de implementaciones para el mismo comportamiento (Ej. Compromisos espacio tiempo)
  • 134. 134 Consecuencias del Patrón Estrategia (2) • - Clientes deben estar consientes de las diferentes Estrategias. Los clientes deben entender las diferencias entre lo que se ofrece y ser capaces de seleccionar el apropiado. Por lo tanto el patrón debería solo ser usado cuando la variación en algoritmo (implementación) es relevante para el cliente. • - Existe algo de sobrecarga en la comunicación entre la Estrategia y el Contexto. Estrategia define una interfase (general). Muchas de los algoritmos más simples no necesitan toda la información que se envía. • - El número de objetos en las aplicaciones aumenta Algunas veces la sobrecarga puede ser reducida cuando EstrategiasConcretas puede ser implementado por objetos sin estado que pueden ser compartidos (Ej. El patrón flyweight)