Upload
estrella-lizarraga
View
29
Download
1
Embed Size (px)
Citation preview
Ingeniería de Sistemas
• Introducción. • Patrones. • Descripción de los Patrones. • Ejemplo: Patrones en el MVC de Smalltalk. • El catálogo de patrones.
• Patrones de Creación. • Patrones Estructurales. • Patrones de Comportamiento.
“Una arquitectura orientada a objetos bien estructurada está llena de patrones. La calidad de un sistema orientado a objetos se mide por la atención que los diseñadores han prestado a las colaboraciones entre sus objetos.”
“Los patrones conducen a arquitecturas más pequeñas, más simples y más comprensibles”
G. Booch
4
“Diseñar software orientado a objetos es difícil pero diseñar software orientado a objetos reutilizable es más difícil todavía. Diseños generales y flexibles son muy difíciles de encontrar la primera vez”
¿Qué conoce un programador experto que
desconoce uno inexperto?
Reutilizar soluciones que funcionaron en el pasado: Aprovechar la experiencia
Hardware Software
Poder reusar componentes y lograr un mantenimiento fácil. Lograr un software flexible
habitualmente
Problema Solución
Patrones de diseño
Un esquema que se usa para solucionar un problema.
El esquema ha sido probado extensivamente, y ha funcionado. Se tiene experiencia sobre su uso.
Elementos principales: ◦ Nombre ◦ Problema ◦ Solución: Descripción abstracta ◦ Consecuencias
Reutilizar diseños abstractos que no incluyan detalles de la implementación.
Un patrón es una descripción del problema y la esencia de su solución, que se puede reutilizar en casos distintos.
Es una solución adecuada a un problema común.
Asociado a orientación a objetos, pero el principio general es aplicable a todos los enfoques de diseño software.
Nombre del patrón. ◦ Describe el problema de diseño, junto con sus soluciones y
consecuencias. ◦ Vocabulario de diseño.
Problema. ◦ Describe cuándo aplicar el patrón. ◦ Explica el problema y su contexto.
Solución. ◦ Elementos que forman el diseño, relaciones, responsabilidades. ◦ No un diseño concreto, sino una plantilla que puede aplicarse en
muchas situaciones distintas. Consecuencias. ◦ Resultados, ventajas e inconvenientes de aplicar el patrón. ◦ ej.: relación entre eficiencia en espacio y tiempo; cuestiones de
implementación etc.
Separar los objetos con los datos ( modelo), sus visualizaciones (vistas) y el modo en que la interfaz reacciona ante la entrada al usuario (controlador).
Separar estos componentes, para aumentar la flexibilidad y reutilización.
Desacoplar vistas de modelos, mediante un protocolo de subscripción/notificación.
Cada vez que cambian los datos del modelo, avisar a las vistas que dependen de él. Estas se actualizan.
Asignación de Responsabilidades – Larman GRASP
Creación – Gamma y Grand Fcatory Method, Abstract Factory, Builder, Prototype, Singleton, etc.
Estructurales – Gamma y Grand Adapter, Iterator, Bridge, facade, Flyweight, Virtual Proxy, etc.
Arquitecturales – Bushman Distribuidos, Interactivos, adaptables, etc
Larman 10 patrones Gamma 23 patrones Bushman 17 patrones Grand 41 patrones
PATRONES
GOF
GRASP
Experto
Creador
Bajo acoplamiento
Alta Cohesión
Controlador
Creacionales
Estructurales
Comportamiento
Instancia única, método de fabricación ,
Fabrica, constructor, prototipo .
Adaptador, puente, objeto Compuesto, envoltorio, fachada,
Peso ligero, proxy
Cadena responsabilidad, orden, Intérprete, iterador, mediador, recuerdo,
Observador, estado, estrategia, método plantilla, visitante
Son para la asignación de responsabilidades, "General Responsibility Assignment Software Patterns". Son una serie de "buenas prácticas" de aplicación recomendable en el diseño de software. Patrones GRASP:
Experto, Creador, Bajo Acoplamiento, Alta Cohesión, Controlador
En que consiste la responsabilidad? Obligaciones o contratos de una clase
Dos clases de responsabilidades
Conocer: información del objeto Hacer: acciones con otros objetos
Es la abreviación del grupo Gang of Four, compuesto por Erich Gamma, Richard Helm, Ralph Jhonson y John Vlisides, quienes en su publicación “Design Patterns” describen 23 patrones de diseño comúnmente utilizados y de gran aplicabilidad en problemas de diseño usando modelamiento UML.
Documentar la experiencia en el diseño, en forma de un catálogo de patrones.
Categorías de patrones: ◦ De creación: implica el proceso de instanciar
objetos. ◦ Estructurales: composición de objetos. ◦ De comportamiento: cómo se comunican los
objetos, cooperan y distribuyen las responsabilidades para lograr sus objetivos.
Los patrones UML son colaboraciones parametrizadas, esto es, son un grupo de clases/objetos colaborando entre sí que se pueden abstraer de un conjunto de escenarios general. Antes de comenzar a usar un patrón primero debe ser creado como un diagrama estándar de UML o existir como tal en algún repositorio
Permite a una clase usar datos y servicios provistos por otras clases independientes proveyendo un acceso uniforme.
1. Instancia única (Singleton) : Asegure que una clase sólo tiene una instancia , y proporcionarle un punto global de acceso a dicha instancia
2. Método fabricación(Factory Method) : Define un interfaz para crear un objeto, pero dejar a subclases decidir sus instancias . El Método De la fábrica deja a una clase la creación de ejemplares o copias a subclases.
3. Fabrica abstracta (Abstract Factory) : Proporciona un interfaz para crear las familias de objetos relacionados o dependientes sin especificar sus clases concretas.
4. Constructor (Builder): Separa la construcción de un objeto complejo de su representación , de modo que el mismo proceso de construcción pueda crear representaciones diferentes.
5. Prototipo(Prototype) : Crea nuevos objetos creándolos de una instancia ya existente.
6. Adaptador (adapter) :Convierte la interfaz de una clase en otra interfaz que otra clase puede usar . debido a que la interfaces es incompatibles con dicha clase
7. Puente ( bridge) :Desacopla una abstracción de su implementación de modo que los dos puedan variar por separado.
8. Peso ligero (Flyweight ) :Reduce la redundancia cuando gran cantidad de objetos poseen idéntica información.
9. Fachada (Facade) : Proporciona un interfaz unificada a un juego de interfaces en un subsistema. La fachada define un interfaz de nivel más alto que hace el subsistema fácil de usar.
10. Envoltorio (Decorator) :Adjunta responsabilidades adicionales a un objeto dinámicamente. Los decoradores proporcionan una alternativa flexible a la subclasificación para ampliar la funcionalidad.
11. Objeto compuesto (Composite) :El objeto compuesto permite tratar a jerarquías de objetos en individuales y composiciones de objetos uniformemente como si se tratase de objetos simples
12. Proxy : Mantiene un representante de un objeto
13. Cadena responsabilidad (Chain of Responsibility ): Encadena los objetos de encubrimiento y pasa la petición a lo largo de la cadena hasta que un objeto la maneja. Permite establecer la línea que deben llevar los mensajes para que los objetos realicen la tarea indicada.
14. Orden (Command) : Encapsula una operación en un objeto, permitiendo ejecutar dicha operación sin necesidad de conocer el contenido de la misma.
15. Intérprete (Interpreter) :Considerando un lenguaje , define un representación para su gramática con un intérprete que usa la representación para interpretar sentencias en el mismo lenguaje.
16. Iterador (Iterator) :Proporciona un modo de tener acceso a los elementos de un objeto agregado secuencialmente sin exponer su representación subyacente.
17. Mediador (Mediator) :Define un objeto que coordine la comunicación entre objetos de distintas clases, pero que funcionan como un conjunto.
18. Recuerdo (Memento) : Sin violar encapsulación, captura y externaliza el estado interno de un objeto de modo que el objeto pueda ser restaurado a este estado más tarde.
19. Observador (Observer) : Define de uno a varios la dependencia entre objetos de modo que cuando se produce un cambio de estado del objeto, todos sus dependientes sean notificados y puestos al día automáticamente.
20. Estado (State) :Permite que un objeto modifique su comportamiento cada vez que cambie su estado interno
21. estrategia (Strategy) : Define una familia de algoritmos (métodos), encapsula cada uno, y los hace permutables. La estrategia deja al algoritmo (método) variar por separado de los clientes (objetos) que lo usan o invocan .
22. método plantilla ( template method) :Define el esqueleto de un algoritmo en una operación, aplazando algunos pasos a subclases. El Método de Plantilla deja a subclases redefinir los ciertos pasos de un algoritmo sin cambiar la estructura del algoritmo.
23. Visitante (Visitor) :Permite definir nuevas operaciones sobre una jerarquía de clases sin modificar las clases sobre las que opera.
Singleton Factory Method
Abstract Factory Builder
Prototype
Abstraen el proceso de creación de instancias.
Ayudan a hacer a un sistema independiente de cómo se crean, se componen y se representan sus objetos.
Un patrón de creación de clases usa la herencia para cambiar la clase de la instancia crear.
Un patrón de creación de objetos delega la creación de la instancia en otro objeto.
Objetivo: ◦ Garantiza que una clase sólo tenga una instancia, y
proporciona un punto de acceso global a ella Nombres: ◦ Único
Ejemplo: ◦ Una única cola de impresión para múltiples
impresoras
Cuando deba haber una única instancia de una clase
Acceso controlado a la única instancia Espacio de nombre reducido Más flexible que las operaciones de clase
Objetivo: ◦ Define una interfaz para crear un objeto, pero deja
que sean las subclases quienes decidan qué clase instanciar
Nombres: ◦ Virtual Constructor, Método de Fabricación
Ejemplo: ◦ Conexiones múltiples
Una clase no puede prever la clase de objetos que debe crear
Una clase quiere que sean sus subclases quienes especifiquen los objetos que ésta crea
Las clases delegan la responsabilidad en una de entre varias clases auxiliares
Creador
MetodoDeFabricacion() UnaOperacion()
ProductoConcretoA CreadorConcreto
MetodoDeFabricacion()
<<creates>>
... producto = MetodoDeFabricacion() ...
return new ProductoConcreto
<<Abstract>> Producto
ProductoConcretoB
Contabilidad
MetodoDeFabricacion() UnaOperacion()
SqlConexion Fabrica
creaConexion()
<<creates>>
... miConexion= miFab.creaConexion() ...
return new OracleConexion
<<Abstract>> Conexion
OracleConexion
Conexion conx = new OracleConexion() Conexion conx = new SQLConexion() Conexion conx = new MySqlConexion() Conexion conx = new PostgreSqlConexion()
Fabrica
Oracle Sql
Server
MySql PostgreSql
Conexion
OracleConexion
<<Abstract>> Conexion
SqlConexion
Fabrica
creaConexion()
<<creates>>
OracleConexion
Objetivo: ◦ Proporciona una Interfaz para crear familias de objetos
relacionados sin especificar clases concretas Nombres: ◦ Kit, Fábrica Abstracta
Ejemplo: ◦ Toolkit de interfaces de usuario en Windows, Linux, Mac
IFabricaAbstracta
CrearProductoA() CrearProductoB()
<<Interface>>
Cliente
FabricaConcreta1
CrearProductoA() CrearProductoB()
IProductoA
FabricaConcreta2
CrearProductoA() CrearProductoB()
ProductoA1 ProductoA2
IProductoB
ProductoB1 ProductoB2
<<creates>>
<<creates>>
<<creates>>
FabricaAbstracta
creaConexion() : Conexion
<<Interface>>
Pagos
Conexion
FabricaHeredada
CrearConexion()
SqlConexion OracleConexion <<creates>>
FabricaAbstracta
creaConexion() : Conexion
<<Interface>>
FabricaHeredada
CrearConexion()
Conexion
SqlConexion OracleConexion
Objetivo: ◦ Permitir que el código cliente controle el proceso de
construcción de los objetos. ◦ Separar la construcción de un objeto de su
representación, de manera que el mismo procesos de construcción pueda crear diferentes representaciones
Nombres: ◦ Constructor
Ejemplo: ◦ Robot constructor de hamburguesas
El algoritmo para crear un objeto complejo debiera ser independiente de las partes de que se compone dicho objeto y de cómo se ensamblan
El proceso de construcción debe permitir diferentes representaciones del objeto que está siendo construido
Permite variar la representación interna de un producto
Aísla el código de construcción y representación
Proporciona un control más fino sobre el proceso de construcción
Producto ConstructorConcreto
ConstruirParte() ObtenerResultado()
Cliente (from Logical View)
Director
Construir()
-constructor
<<creates>>
para todos los objetos { constructor->ConstruirParte() }
Constructor
ConstruirParte()
RobotHamburguesa
trabajar() cargaAcciones()
Cliente (from Logical View)
Builder
Construir()
-constructor
<<creates>>
para todos los objetos { robot->cargaAcciones () }
<<interface>> Robot
trabajar() cargaAcciones()
RobotHotDog
trabajar() cargaAcciones()
ProductoHam ProductoHot
RobotHamburguesa
trabajar() cargaAcciones()
<<interface>> Robot
trabajar() cargaAcciones()
RobotHotDog
trabajar() cargaAcciones()
RobotHamburguesa
trabajar() cargaAcciones()
RobotHotDog
cargaAcciones()
Builder
Construir()
-constructor <<interface>>
Robot
trabajar() cargaAcciones()
Objetivo: ◦ Crear nuevos objetos copiando una instancia
prototípica Nombres: ◦ Prototipo
Ejemplo: ◦ Editor de partituras musicales
Cuando las clases a instanciar sean especificadas en tiempo de ejecución
Para evitar jerarquías de clases de fábricas con jerarquía de clases de productos
Cuando las instancias de clases puedan tener un estado de entre un conjunto reducido
Añadir y eliminar productos en tiempo de ejecución
Especificar nuevos objetos modificando valores
Especificar nuevos objetos variando la estructura
Reduce la herencia Configurar dinámicamente una aplicación con
clases
Prototype
Clonar() : Prototype
Cliente prototipo
1 1
PrototipoConcreto1
Clonar() : Prototype
p = prototipo->Clonar() PrototipoConcreto2
Clonar() : Prototype
devuelven una copia a sí mismos
devuelven una copia a sí mismos
Figura
Clonar() : Figura
PruebaFiguras prototipo
1 1
Circulo
Clonar() : Figura
p = circulo.Clonar() Cuadrado
Clonar() : Figura
devuelven una copia a sí mismos
devuelven una copia a sí mismos