Definir qué es un patrón de diseño. Cuándo utilizarlos. Clasificación de patrones. Patrones mas...

Preview:

Citation preview

Definir qué es un patrón de diseño. Cuándo utilizarlos. Clasificación de patrones. Patrones mas importantes. Ejemplos

El diseño es una actividad₋ El cómo frente al qué₋ Hacerlo correcto frente a hacer lo correcto₋ Asignar responsabilidades a las clases

Algunas propiedades no funcionales₋ Reutilización₋ Facilidad de modificación₋ Facilidad de comprensión₋ Robustez₋ Eficiencia₋ Facilidad de uso

Definición:₋ Patrón: Modelo que sirve de muestra para

sacar otra cosa igual (RAE).₋ Patrón de diseño: Una solución general a un

problema general que puede adaptarse a un problema concreto.

Christopher Alexander - 1979 - The Timeless Way of Building.

Definió qué es un patrón de diseño Pattern Language. 1987, Ward Cunningham y Kent Beck Design Patterns - GoF

Según la escala o nivel de abstracción:₋ Patrones de arquitectura₋ Patrones de diseño₋ Patrones de Análisis₋ Patrones de bajo nivel(idiomas)

La plantilla mas común es la utilizada por el GoF y consta de los siguientes apartados:₋ Nombre de patrón₋ Clasificación del patrón₋ Intención₋ Motivación₋ Aplicabilidad₋ Estructura₋ Participantes₋ Colaboraciones₋ Consecuencias₋ Implementación₋ Código de ejemplo₋ Patrones relacionados

Clasificación de patrones del libro GoF:₋ Creacionales₋ Estructurales₋ Comportamiento

Patrones creacionales:₋ Abstract Factory – (Fabrica abstracta)₋ Builder – (Constructor virtual)₋ Factory Method – (Método de fabricación)₋ Prototype – (Prototipo)₋ Singleton – (Instancia Única)

Patrones estructurales:₋ Adapter – (Adaptador)₋ Bridge – (Puente)₋ Composite – (Objeto compuesto)₋ Decorator – (Envoltorio)₋ Facade – (Fachada)₋ Flyweight – (Pero ligero)₋ Proxy

Patrones de comportamiento:₋ Chain of Responsability – (Cadena de

responsabilidad)₋ Command – (Orden)₋ Interpreter – (Interprete)₋ Iterator – (Iterador)₋ Mediator – (Mediador)

Patrones de comportamiento:₋ Chain of Responsability – (Cadena de

responsabilidad)₋ Command – (Orden)₋ Interpreter – (Interprete)₋ Iterator – (Iterador)₋ Mediator – (Mediador)₋ Memento – (Recuerdo)₋ Observer – (Observador)₋ State – (Estado)₋ Strategy – (Estrategia)₋ Template Method – (Método plantilla)₋ Visitor – (Visitante)

En las próximas transparencias mostraremos los patrones más importantes que los alumnos deben saber, para desarrollar la mayor cantidad de problemas.

Estos son:₋ Strategy₋ State₋ Singleton₋ Composite₋ Template Method₋ Proxy₋ Observer₋ Iterator₋ Facade

Intención:₋ Definir un grupo de clases que representan un

conjunto de posibles comportamientos. Estos comportamientos pueden ser fácilmente intercambiados en una aplicación modificando la funcionalidad en cualquier instante.

Motivación:₋ Estructurar una familia de algoritmos de modo

que sus clientes puedan intercambiarlos en tiempo de ejecución.

Participantes:₋ Istrategy: declara una interfaz común para todos

las variantes de un algoritmo₋ StrategyX: implementa una variable del

algoritmo₋ StrategyClient: es el responsable de crear y

mantener una referencia a una estrategia concreta.

Colaboraciones:₋ El cliente de la estrategia decide la estrategia a

crear.

Intención:₋ Cambiar fácilmente el comportamiento de un

objeto en tiempo de ejecución.

Motivación:₋ Cambiar el comportamiento dependiendo del

estado.₋ Cuando queremos que un objeto cambie su

comportamiento, según cambia su estado, se presenta el problema de la complejidad de código.

Participantes:₋ Context: Define la Interfaz y mantiene una

instancia con el estado actual.₋ State: Define una interfaz para el

comportamiento asociado a un determinado estado del Contexto.

₋ ConcreteState: Cada subclase implementa el comportamiento asociado con un estado del contexto.

Intención:₋ Garantizar que una clase sólo tenga una

instancia y proporcionar un punto de acceso global a ella.

Motivación:₋ Es importante que algunas clases tengan

exactamente una instancia. Ejemplo: aunque puede haber muchas impresoras en un sistema, sólo debería haber una cola de impresión.

₋ Una variable global hace accesible a un objeto, pero no nos previene de crear múltiples instancias de un objeto.

Participantes:₋ Singleton: Define una operación getInstance

que permite que los clientes, accedan a su única instancia. GetInstance() es una operación de clase (es decir en java, tiene el modificador static). Es el responsable de crear su única instancia.

Consecuencias:₋ Acceso controlado a su única instancia. Puesto

que la misma encapsula su única instancia, puede tener un control estricto sobre cómo y cuándo acceden a ella los clientes.

₋ El patrón Singleton es una mejora sobre las variables globales. Ya que evita contaminar el espacio de nombres con instancias de clases.

₋ El patrón hace fácil cambiar de opinión y poder crear más de una instancia de la clase.

Intención:₋ Componer objetos en jerarquías parte-todo y

permitir a los clientes tratar objetos simples y compuestos de modo uniforme.

Motivación:₋ Necesitamos representar un conjunto de

elementos de una interfaz gráfica de usuario.₋ Algunos de estos elementos son simples, mientras

que otros están formados por varios elementos más simples. El comportamiento y/o la información que proporciona un elemento complejo está determinada por los elementos que lo componen.

Participantes:₋ Client: Manipula objetos a través de la interfaz

proporcionada por Component.

₋ Component: Declara la interfaz para los objetos de la composición, es la interfaz de acceso y manipulación de los componentes hijo e implementa algunos comportamientos por defecto.

Participantes:₋ Composite: Define el comportamiento de los

componentes compuestos, almacena a los hijos e implementa las operaciones de manejo de los componentes.

₋ Leaf: Definen comportamientos para objetos primitivos del compuesto.

Colaboración:₋ Los clientes utilizan la interfaz de la clase

component para interactuar con los elementos de la estructura compuesta. Si el recipiente es una hora, se trata correctamente, sino se redirige la petición a sus hijos realizando operaciones adicionales

Consecuencias:₋ Define jerarquías de clases formadas por

objetos primitivos y compuestos.₋ Simplifica al cliente, ya que puede tratar de

forma uniforme estructuras compuestas.₋ La desventaja de facilitar añadir nuevos

componentes es que hace difícil restringir los componentes de un compuesto.

Intención:₋ Proporcionar un método que permite que las

subclases redefinan parte del método sin reescribirlo.

Motivación:₋ Cuando se construyen jerarquías de clases

complejas para una aplicación, a menudo se duplican distintas partes de código. esa situación no es deseable, porque la intención es reutilizar tanto código como sea posible

Participantes:₋ Client: Manipula objetos a través de la interfaz

proporcionada por Component.₋ AbstractTemplate: Implementa un método

plantilla que define el esqueleto de un algoritmo y define métodos abstractos que implementan las subclases concretas.

Participantes:₋ ConcreteTemplate: Implementa los métodos

abstractos para realizar los pasos del algoritmo que son específicos de la subclase..

Colaboración:₋ Las clases concretas confían en que la clase

abstracta implemente la parte fija del algoritmo.

Consecuencias:₋ Favorece la reutilización del código. Muy útiles

para construir bibliotecas, pues ayuda a factorizar el comportamiento común de las clases.

₋ Lleva a una estructura de control invertido (Principio de Hollywood): la superclase base invoca los métodos de las subclases.

Intención:₋ Proporcionar un representante de otro objeto,

por distintas razones como pueden ser el acceso, la velocidad o la seguridad, entre otras.

Motivación:₋ Retrasar el coste de crear e inicializar un

objeto hasta que es realmente necesario. Por ejemplo, no abrir las imágenes de un documento hasta que no son visibles.

Participantes:₋ Subject: Define la interfaz común para el

RealSubject y el proxy, de modo que pueda usarse un Proxy en cualquier sitio en el que se espere un RealSubject.

₋ RealSubject: Define el objeto real representado.₋ Proxy: Mantiene una referencia que permite al

Proxy acceder al objeto real, Proporciona una interfaz idéntica a la del sujeto, de manera que un Proxy pueda ser sustituido por el sujeto real. Controla el acceso al sujeto real, y puede ser responsable de su creación y borrado.

Consecuencias:₋ El patrón Proxy introduce un nivel de

indirección al acceso a un objeto. Esta indirección adicional tiene muchos posibles usos, dependiendo del tipo de proxy.

Intención:₋ Proporcionar a los componentes una forma flexible de

enviar mensajes de difusión a los receptores interesados.

Motivación:₋ Muchas veces un efecto lateral de partir un sistema en una

colección de objetos relacionados es que necesitamos mantener la consistencia entre objetos relacionados.

Participantes:₋ Subject: Conoce a sus observadores,

Proporciona una Interfaz para que se suscriban los objetos Observer.

₋ Observer: Define una interfaz para actualizar los objetos que deben ser notificados de cambios en el objeto Subject.

₋ ConcreteSubject: Guarda el estado de interés para los objetos ConcreteObserver, envía una notificación a sus observadores cuando cambia su estado.

Participantes:₋ ConcreteObserver: Mantiene una referencia

a un objeto ConcreteSubject, Guarda el estado que debería permanecer sincronizado con el objeto observado, Implementa la interfaz Observer para mantener su estado consistente con el objeto observado.

Colaboraciones₋ El objeto observado notifica a sus

observadores cada vez que ocurre un cambio.₋ Después de ser informado de un cambio en el

objeto observado, cada observador concreto puede pedirle la información que necesita para reconciliar su estado con el de aquél.

Intención:₋ Proporcionar una forma coherente de acceder

secuencialmente a los elementos de una colección, independientemente del tipo de colección subyacente.

Motivación:₋ Un objeto agregado, tal como una lista, debería

proveer un modo de brindar acceso a sus elementos sin exponer su estructura interna. Más aún, quizás se desea recorrer la lista en diferentes formas, dependiendo de lo que Ud. quiera realizar.

Participantes:₋ Iterador: Define una interfaz para recorrer los

agregados.₋ IteradorConcreto: implementa la interfaz

iterador.₋ Agregado: Define la interfaz para crear un

objeto iterador.₋ AgregadoConcreto: Implementa la interfaz

de creación de un iterador para devolver un iterador concreto.

Colaboraciones:₋ Un iteradorConcreto almacena la posición del

objetoactual en el agregado de modo que sabe cual es el objeto siguiente en el recorrido.

Intención:₋ Proporcionar una interfaz simplificada para un grupo de

subsistemas o un sistema complejo.

Motivación:₋ Simplificar el acceso a un conjunto de clases

proporcionando una única clase que todos utilizan para comunicarse con dicho conjunto de clases.

₋ Reducir la complejidad y minimizar dependencias

Participantes:

₋ Facade: Conoce cuales clases del subsistema son responsables de una petición y delega las peticiones de los clientes en los objetos del subsistema.

₋ Clases del subsistema: Implementan la funcionalidad del subsistema, manejan el trabajo asignado por el objeto Facade y además de esto no tienen ningún conocimiento del Facade.

Consecuencias:₋ Oculta a los clientes el comportamiento del

subsistema, haciendo que este sea mas fácil de usar.

₋ Promueve un débil acoplamiento entre subsistemas

Patrones de diseño. Clasificación de patrones. Historia Lista de Patrones Patrones más importantes. Ejercicios

GoF – Gang of Four

Recommended