6 3-templates y patrones
-
Upload
mariano-pereda -
Category
Documents
-
view
67 -
download
0
Transcript of 6 3-templates y patrones
Diseño de SoftwareDr. Amos Sorgen
Agosto de 2011 slide 1
Templates
Autor Dr Amos Sorgen // Editor Mg Ing Rolando TitioskyBasado en: Ing de Software (Ian Sommersville); UML y Patrones (Craig Larman)
Diseño de software Dr. Amos Sorgen
2Agosto 2011
Function Templates• Nos permite escribir funciones genéricas que pueden ser
usadas con varios tipos de datos.• Sin templates, se tendrían que rescribir muchas funciones
(y clases). • Ejemplo: una función que retorna el máximo de dos
valores. int max(int x, int y) { return (x < y) ? y : x; } float max(float x, float y) { return (x < y) ? y : x; }
template <typename T> T max(T x, T y) { return (x < y) ? y : x; }Esta funcion funciona con cualquier tipo que se pueda
comparar con el “operador <“ Funciona hasta con una clase desconocida por el
compilador, si se implementa el “operador <“
Diseño de SoftwareDr. Amos Sorgen
Agosto de 2010 slide 3
Patrones de Diseño OO
Diseño de software Dr. Amos Sorgen
4Agosto 2011
Patrones de diseño• Los patrones de diseño son la base
para solucionar problemas de diseño comunes a distintas aplicaciones.
• Proveen una solución estándar para un problema común de diseño
• Se presentan en formas distintas porque lo que varia es el dominio del problema y por lo tanto las clases que entran en juego
Diseño de software Dr. Amos Sorgen
5Agosto 2011
Ejemplo de problemas similares• Modelar en un sistema S que tiene Y-s y z-s. A su vez los Y-s
pueden recursivamente incluir Y-s y z-s (las z-s no pueden incluir a nadie) formando un arbol cuyas ramas son las Y-s y cuyas hojas son las z-s.
• Hay muchas actividades comunes a las Y-s y a las z-s que cuando se aplican a las Y-s se aplican recursivamente:– Delete()– Copy()– Display()– Move()– …
• Hay actividades que solo aplican a las Y-s– Add(Y or z)– GetNextChild(Y or z)
• Ejemplos: – S = sistema operativo Y = directorio z= archivos– S = sistema grafico Y = gráficos complejos z = elementos
geométricos– S = un sistema de ventanas Y = ventanas z = controles
Diseño de software Dr. Amos Sorgen
6Agosto 2011
Se Necesita…• Componer objetos en estructuras de
árbol para representar jerarquías parte-todo
• Y Que permita tratar a las “hojas” y a las “ramas” de manera uniforme (composición recursiva).
Diseño de software Dr. Amos Sorgen
7Agosto 2011
Solucion particular
Diseño de software Dr. Amos Sorgen
8Agosto 2011
Solución general: Composite Patern
Diseño de software Dr. Amos Sorgen
9Agosto 2011
Descripción de los patrones • Nombre del patrón: nombre estándar del patrón por el cual
será reconocido en la comunidad (normalmente se expresan en inglés).
• Clasificación del patrón: creacional, estructural o de comportamiento.
• Intención: ¿Qué problema pretende resolver el patrón? • Motivación: Escenario de ejemplo para la aplicación del patrón. • Aplicabilidad: Usos comunes y criterios de aplicabilidad del
patrón. • Estructura: Diagramas de clases oportunos para describir las
clases que intervienen en el patrón. • Consecuencias: Consecuencias positivas y negativas en el
diseño derivadas de la aplicación del patrón. • Implementación: Técnicas o comentarios oportunos de cara a
la implementación del patrón. • Código de ejemplo: Código fuente ejemplo de implementación
del patrón. • Usos conocidos: Ejemplos de sistemas reales que usan el
patrón.
Diseño de software Dr. Amos Sorgen
10Agosto 2011
Gang of Four La 'Banda de los cuatro',
• Es el nombre con el que se conoce comúnmente a los autores del libro Design Patterns. – Erich Gamma, Richard Helm, Ralph Johson, John Vlissides
• Pero se usa también como nombre genérico para los 23 patrones que aparecen en ese libro
Patrones creacionales: Se aplican cuando hay creación de objetos
Patrones estructurales: Se aplican cuando hay composición de objetos
Patrones conductuales: Se aplican cuando objetos interactúan
Diseño de software Dr. Amos Sorgen
11Agosto 2011
GoF - Patrones Creacionales
• Absract Factory - Fábrica AbsractaCrea la instancia de la clase “hija” que corresponde al contexto (ej. BotónWindows o un BotónLinux )
• Factory Method – Metodo de fabricaDelega toda la creación de la instancia a la subclase.
• Builder - ConstructorConstruye objetos complicados usando métodos en las subclases
• Prototype - PrototipoCrea una nueva instancia, copiando un prototipo
• SingletonUna clase de las que sólo una sola instancia puede existir
Diseño de software Dr. Amos Sorgen
12Agosto 2011
GoF - Estructurales• Adapter - Adaptador
Adapta interfaces de diferentes clases para ser usadas por una unica.
• Bridge - PuenteCrea un puente entre la verdadera clase y la clase como es usada por otras clases
• Composite - CompuestoUna estructura de árbol de objetos simples y compuestos
• Decorator - DecoradorAñade funcionalidades a los objetos de forma dinámica (run time)
• Facade - FachadaUna clase única que provee una interfase simplificada a todo un subsistema
• Flyweight - Peso moscaPermite compartir memoria entre objetos similares.
• Proxy - ApoderadoUn objeto que representa otro objeto pero que consume muchos menos recursos
Diseño de software Dr. Amos Sorgen
13Agosto 2011
GoF - de comportamiento - 1• Chain of Responsibilities - Cadena de
ResponsabilidadesUna manera de pasar un pedido, en una cadena de objetos hasta que se encuentre aquel que pueda cumplirlo.
• Command - ComandoEncapsula la petición de un comando en un objeto que puede ser guardado, trasmitido, etc.
• Interpreter - IntérpreteInterpreta frases de un lenguage.
• Iterator - ItereadorAccede secuencialmente a los elementos de una colección
• Mediator - MediadorSimplifica la comunicación entre las clases
• Memento - RecuerdoCaptura y restaura si es necesario el estado de un objeto
Diseño de software Dr. Amos Sorgen
14Agosto 2011
GoF - comportamiento – 2• Observer - Observador
Una forma de notificar un cambio en un objeto a otros objetos • State - Estado
Altera el comportamiento de un objeto cuando su estado cambia
• Strategy - EstrategiaEncapsula un algoritmo dentro de un objeto. De esta forma se puede seleccionar que algoritmo correr en tiempo de ejecucion.
• Template Method - Plantilla MétodoAplaza la implementación concreta de un algoritmo a una subclase
• Visitor - VisitanteSe usa para introducir definir nuevas funcionalidades a una clase sin necesidad de cambiarla.
Diseño de software Dr. Amos Sorgen
15Agosto 2011
Otra categorización de los Patrones de diseño – 1
• Patrones de descomposición estructural• Se aplican cuando se diseñan subsistemas y componentes complejos usando
módulos que cooperan unos con otros• Ejemplo whole-part
• Patrones de organización de trabajo • Se aplican cuando componentes colaboran juntos para resolver un problema complejo• Ejemplo: master-slave
• Patrones de acceso de control• Se aplican cuando hay que “cuidar” y “controlar” el acceso a servicios y componentes• Ejemplo: proxy
• Patrones de administración• Se aplican cuando hay que manejar colecciones homogéneas de objetos, servicios y
componentes en su totalidad.• Ejemplo: command processor, view handler
• Patrones de comunicación• Se aplican cuando hay que organizar comunicación entre componentes• Ejemplo: forward-receiver, dispatcher-server, publisher-subscriber
Diseño de software Dr. Amos Sorgen
16Agosto 2011
Patrones populares• Composite• Singleton• Factory• Abstract factory (Factory method)• Adapter• Façade• Observer• Strategy• State• Decorator• Prototype• Proxy• Chain of responsibility• Command• Iterator• Mediator
Diseño de software Dr. Amos Sorgen
17Agosto 2011
SingletonProblema: Se quiere
asegurar que una clase tiene una sola instancia
Ejemplo: Un sistema que administra los recursos humanos de una empresa necesite que no haya mas que un unico objeto “presidente”
Generalización: “Pool Object”
Class A { Private static A* The_a; … Otros datos privados … Otros metodos privados Public A() { If (~The_a) The_a = make_a(); return A& The_a; } … otros datos publicos … otros metodos publicos}
A* A::The_a = NULL;
Diseño de software Dr. Amos Sorgen
18Agosto 2011
FactoryProblema: Se quiere tratar homogéneamente la
creación y subsecuente manipulación de objetos que responden a un mismo concepto pero que tienen distinto comportamiento en distintas circunstancias
Ejemplo: Manipulación de elementos de IU bajo distintos sistemas operativos.
Solución: Se genera una herencia de “factories” paralela a la herencia de los objetos.Para ello se crea el objeto (en el ejemple de “WidgetFactory”) de acuerdo a la clase especifica que dictan las circunstancias
Diseño de software Dr. Amos Sorgen
Factory
Diseño de software Dr. Amos Sorgen
20Agosto 2011
Abstract Factory
Diseño de software Dr. Amos Sorgen
21Agosto 2011
AdapterProblema: Proporcionar una interfazestable para clases que dan losmismos servicios pero con distintas
interfacesEjemplo: Agregar en una librería grafica
un elemento que pertenece a otraSolución: Estandarizar las interfacesoriginales, mediante un objeto adaptadorintermedio
Diseño de software Dr. Amos Sorgen
22Agosto 2011
Adapter - Ejemplo
Diseño de software Dr. Amos Sorgen
23Agosto 2011
FacadeProblema: Se tiene
una biblioteca de clases que dan muchos servicios con muchos métodos y se quiere suministrar una interfaz unificada y sencilla para los usuarios de la biblioteca
Ejemplo:
Diseño de software Dr. Amos Sorgen
24Agosto 2011
Facade Ejemplo
Diseño de software Dr. Amos Sorgen
25Agosto 2011
Facade - Solución
Diseño de software Dr. Amos Sorgen
26Agosto 2011
Observer
Problema: Se quiere que, cuando el objeto A cambie su estado, los objetos X, Y, Z sean notificados y se actualicen de acuerdo.
Solución: A tiene una lista de objetos “observadores” que están interesados en sus cambios. Hay un mecanismo de “registrarse como observador”
Diseño de software Dr. Amos Sorgen
27Agosto 2011
Observer - Ejemplo
Diseño de software Dr. Amos Sorgen
28Agosto 2011
StrategyProblema: Aplicar distintas estrategias de acuerdo a la situación en
tiempo de ejecución.Ejemplo: La forma de validar los datos entrantes es función del tipo
de datos, la fuente de los datos, u otros factores de discriminación.
Solución: Definir cada estrategia como una clase independiente. De acuerdo al contexto se crea la clase concreta que corresponde y en su creación se aplica la estrategia pertinente.
Diseño de software Dr. Amos Sorgen
29Agosto 2011
StateProblema: Se quiere encapsular (abstraer) las
operaciones que dependan del estado de un objeto.
Ejemplo: Para una clase “carita” , los estados serían - Triste
- Serio - ContentoY la operación que depende del estado sería -
“dibujar”
Diseño de software Dr. Amos Sorgen
30Agosto 2011
State – Cambios de estado
enfadarse
alegrarse
alegrarse
Cambios de ánimo
Cara EstadoCara
v: EstadoCara
alegrarenfadarpintar…
alegrarenfadarpintar…
Triste
alegrarenfadarpintar…
Contenta
alegrarenfadarpintar…
Seria
alegrarenfadarpintar…
Cara:alegrar{v.alegrar}
Diseño de software Dr. Amos Sorgen
31Agosto 2011
DecoratorProblema: Se quiere añadir funcionalidad (distinta) a toda una serie
de clases heredadasEjemplo: Tenemos una super-clase Ventana y queremos añadirle
funcionalidad para que se dibuje un alrededor de todos los tipos de ventanas.
Solución: Se crea una clase “XX_decorado” que hereda de la super-clase y al mismo tiempo la contiene. De forma que accesando a una funcion de “XX_decorado”, se accesa a la misma función de XX y a los agregados
Diseño de software Dr. Amos Sorgen
32Agosto 2011
Prototype• Problema: Sin saber que sub-clase de objeto se esta
manipuleando, se quiere tener una copia del mismo. • Ejemplo: En un sistema gráfico se quiere copiar la figura
elegida por el usuario en la IU.• Solución: Se crea una jerarquía que produce objetos
“cloneando” prototipos de acuerdo al tipo de objeto que se quiera clonear.
Diseño de software Dr. Amos Sorgen
33Agosto 2011
Proxy • Problema: Se quiere acceder a un objeto pero sin crearlo localmente
porque su creación local consume muchos recursos.• Ejemplo: Se quiere acceder sólo al nombre del cliente, que reside en el
objeto tipo “cliente” en un server remoto. Seria muy costoso recrear todo el objeto.
• Solución: Se crea una jerarquía que permita crear un objeto “liviano” conectado al objeto “pesado”
• Generalización: “Proxy – New Function”
Diseño de software Dr. Amos Sorgen
34Agosto 2011
Chain of Responsibility • Problema: Se quiere que las peticiones emitidas al sistema sean
atendidas por distintos objetos receptores en función del estado del sistema (dinámicamente).
• Ejemplo: No se sabe qué impresoras está libre y se quiere que el pedido de impresión llegue la que esta libre y lo realice.
• Solución: establecer una cadena de objetos receptores a través de los cuales se pasa una petición formulada por un objeto emisor. Cualquiera de los objetos receptores puede responder a la petición en función de un criterio establecido.
Diseño de software Dr. Amos Sorgen
35Agosto 2011
Command • Problema: Se quiere tratar a una función/
pedido/ comando como si fuera un objeto para poder – registrarlos, – gestionar colas, – restaurar el estado del sistema (si es necesario) – tratarlos con una interfaz generalizada.
• Ejemplo: Queremos notificar distintos sucesos en el sistema en un orden que no sea la orden en que acontecieron.
• Solución: Los objetos en vez de invocar a otros, crean objetos de tipo “commando” que son ejecutados asincrónicamente a su producción.
Diseño de software Dr. Amos Sorgen
36Agosto 2011
Command • A a, Queue q ;• ….• /* a.do1;• /* A_command hereda de Command• A_command c = do_command(a, “do1) ;• Q.add(c) ;• -----------------• Queue::serve_next {• …. • Command c = next();• c.execute();• }
Diseño de software Dr. Amos Sorgen
37Agosto 2011
Command - Solución
Diseño de software Dr. Amos Sorgen
38Agosto 2011
Iterator • Problema: Se quiere tratar a toda colección
de objetos en forma estándar irrespectivamente de la estructura de la colección
• Ejemplo: Queremos siempre tener la misma forma de tratar una colección:– Primero(), – Siguiente(), – HayMas() – ElementoActual()
• Solucion: Crear para toda clase de tipo contenedor, el “Iterator” que se ocupa de implementar las funciones estándar
Diseño de software Dr. Amos Sorgen
39Agosto 2011
Iterator - SoluciónVector vec = new Vector();
vec.add( new String( "hola“ ) );
vec.add( new String( "adios“ ) );
Iterator it = vec.iterator();
while ( it.hasNext() ) System.out.println( (String) it.next() );
Diseño de software Dr. Amos Sorgen
40Agosto 2011
Mediator • Problema: Se quiere encapsular las interacciones de todo un conjunto de
objetos (colegas) en un solo objeto para evitar tener conexiones de tipo N:N (bajo acoplamiento).
• Los objetos ya no se comunican directamente entre sí, sino a través del mediador. Esto reduce las dependencias entre los objetos que se comunican .
• Ejemplo: Una ventana con numerosos componentes gráficos (widgets) que tienen fuertes dependencias entre si. reglas del tipo "si el campo de edición E2 está lleno, entonces se inhabilita habilita el botón B1 y el campo de edición E3”.Se quiere desacoplar los widgets
• Solución: Crear un objeto mediador que todos los “colegas” conocen. Las interacciones entre colegas se realizan a través del envío de mensajes al mediador y de este a los colegas.
Diseño de software Dr. Amos Sorgen
41Agosto 2011
Mediator - Solución
Diseño de software Dr. Amos Sorgen
42Agosto 2011
Preguntas