PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

54
PATRONES PATRONES DE DISEÑO DE DISEÑO

Transcript of PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Page 1: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

PATRONESPATRONESDE DISEÑODE DISEÑO

Page 2: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones Patrones estructuralesestructurales

(Structural patterns)(Structural patterns)

Page 3: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrón Adapter

Propósito. Convertir la interfaz de una clase en otra esperada por el cliente

Motivación

ShapeEditorDibujoBoundigBox()createManipulator

TextView

getExtent()

TextShapeBoundigBox()createManipulator

LineShapeBoundigBox()createManipulator

Patrones estructurales

Page 4: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Estructura. Class Adapter

El adaptador implementa la intertaz del Target y extiende la clase adaptada

Target

Adapter

Client

request()

request()

Adaptee

specificRequest()

Patrones estructurales

Page 5: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrón Adapter

Estructura. Object adapter. El adaptador extiende la interfaz del target y tiene un objeto del tipo del objeto adaptado (composición)

Target

Adapter

Client

Request()

request()

Adaptee

specificRequest()

Target

Adapter

Client

Request()

request()

Adaptee

specificRequest()

Patrones estructurales

Page 6: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Participantes Target (Figura) Client (EditorDibujo) Adaptado (TextView) Adaptador (FiguraDeTexto)

Colaboraciones Los clientes invocan operaciones a un objeto del

tipo Adapter A su vez el adaptador invoca operaciones en un

objeto de la clase del adaptador (o invoca operaciones definidas en la superclase)

Patrones estructurales

Page 7: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Bridge (puente)

Propósito. Desacoplar una abstracción de su implementación de manera que las dos puedan variar independientemente

Motivación

WindowImp

XWindowImp

devDrawText()

devDrawText()

PMWindowImp

devDrawText()

WindowdrawText()drawRect()

IconWindow()

drawBorder()

DialogWindow()

drawBorder()

Patrones estructurales

Page 8: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Estructura

Implementador

ConcreteImplA

operationImp()

operationImp()

ConcreteImplB

operationImp()

Abstraction

operacion()

RefinedAbstraction

Abstraction

operacion()

Page 9: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Participantes Abstracción (Window) RefinedAbstraction (IconWindow) Implementor (WindowImp) ConcreteImplementor (XwindowImp, PMWindowImp

Colaboraciones. La abstracción envía las solicitudes de los clientes a

las implementaciones

Patrones estructurales

Page 10: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Consecuencias

Desacoplamiento entre interfaz e implementación

Más facilidad para extender el sistema

Esconde los detalles de la implementación

Page 11: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Composite (composición)

Organizar objetos en estructuras de árbol para representar jerarquías todo-parte. Permite a los clientes tratar de manera uniforme a objetos individuales y a agrupaciones de objetos

Motivación

Graphic

Rectangle

draw()add(graphic)remove(graphic)

draw()

Picture

draw()add(graphic)

Line draw()

Patrones estructurales

Page 12: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Estructura

Componente

Hoja

operacion()agregar(comp)eliminar(comp)

operacion()

Compuesto

operation()agregar(comp)

Cliente

Page 13: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Participantes

Componente (Figura)

Hoja (Rectángulo, círculo, línea, texto)

Compuesto (Dibujo)

Cliente

Colaboraciones

Los clientes usan la interfaz Componente para interactuar con objetos en la jerarquía Composite

Si el receptor es una hoja la solicitud es manejada directamente. Si es un Compuesto la solicitud es pasada a sus Componentes hijos

Page 14: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Consecuencias

Define jerarquías de objetos primitivos y compuestos que son iguales para los clientes

Hace más simple al cliente. Los clientes pueden manejar los objetos simples y compuestos de una misma forma

Facilita el agregar nuevos tipos de componentes. Los nuevos objetos funcionan bien con el código de cliente existente

Page 15: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Decorator (decorador). Wrapper

Propósito. Dar responsabilidades adicionales a un objeto dinámicamente. Es una alternativa a la herencia para extender funcionalidad

Motivación

Patrones estructurales

VisualComponent

TextView

draw()

draw()

Decorator

ScrollDecorator draw()drawBorder()

draw()

BorderDecorator draw()drawBorder()

Page 16: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Aplicabilidad Para agregar funcionalidad a objetos individuales

dinámicamente sin afectar otros objetos Cuando la extensión por herencia es impráctica

Participantes Componente ComponenteConcreto Decorador DecoradorConcreto

Page 17: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Estructura

Component

TextView

operation()

operation()

Decorator operation()

ConcreteDecoratorB operation()addedBehavior()

ConcreteDecoratorA operation()addedBehavior()

Page 18: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Colaboraciones

Decorator pasa las solicitudes a su objeto interno. Puede realizar operaciones adicionales antes o después de invocar al objeto.

Consecuencias

Más flexibilidad que usar herencia

Evita que las clases tengan exceso de características

Un decorador y su componente no son idénticos

Muchos objetos pequeños.

Page 19: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrón Facade (fachada)

Propósito. Proveer una interfaz unificada a un conjunto de interfaces que constituyen un subsistema

Motivación.

Un sistema administrativo Cliente Factura Artículo ManejadorFacturas (la fachada)

Un compilador Escaner, Parser, BytecodeStream Compilador (la fachada)

Patrones estructurales

Page 20: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Aplicabilidad. Usar Fachada cuando

Se desea proveer una interfaz simple a un sistema complejo

Hay muchas dependencias entre los clientes y las clases que implementan una abstracción

Se desea organizar el sistema en capas.

Participantes

Fachada. Sabe cuales clases son responsables de una solicitud

Clases del subsistema. Implemente la funcionalidad

Page 21: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Colaboraciones

Los clientes se comunican con el subsistema enviando solicitudes a la fachada, la cual las envía a los objetos apropiados. La fachada puede hacer cierto trabajo adicional.

Los clientes que usan la fachada no tienen acceso a los objetos del subsistema.

Page 22: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Consecuencias

Aísla a los clientes de los componentes del subsistema, lo cual reduce el número de componentes que el cliente utiliza

Promueve un acoplamiento débil entre el subsistema y los clientes.

No impide que las aplicaciones utilicen las clases del subsistema.

Page 23: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Patrón Flyweight.

Propósito. Compartir objetos cuando la cantidad es muy grande.

Motivación.

Los caracteres de un procesador de palabras podrían ser objetos.

La cantidad de caracteres en un documento puede ser muy grando

Cada caracter es compartido por los objetos que lo contetienen.

Page 24: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Estado intrínseco y extríniseco

El estado intrínseco es almacenado en el objeto.

El estado extrínseco es pasado (contexto) como parámetro en las operaciones.

Aplicabilidad. Usar Flyweight cuando

Una aplicación usa un gran número de objetos

Los costos de almacenamiento son altos debido al gran número de objetos

La mayor parte del estado del objeto puede ser extrínseco

Page 25: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Estructura

Page 26: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Participantes

Flyweight

ConcreteFlyweight

UnsharedConcreteFlyweight

FlyweightFactory

Cliente

Page 27: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Colaboraciones

Los clientes no crean directamente los objetos Flyweight, sino que deben invocar las fábricas

El estado extrínseco es mantenido por el cliente y pasado cuando se invocan métodos que lo requieren.

Consecuencias

Produce ahorro de la capacidad almacenamiento

Reduce el número total de objetos

Reduce el tamaño del estado intrínseco por objeto.

Page 28: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Proxy. Provee un sustituto de un objeto

Motivación Un procesador de palabras debe crear muchos

objetos. Algunos son costosos (imágenes) En lugar de crear imágenes al abrir el documento,

se crea un proxy Cuando se necesita la imagen el proxy la crea

Page 29: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Aplicabilidad

Remote proxy. Provee un representante local de objetos que están en otro espacio de direcciones (embajador)

Proxy virtual. Usado para crear objetos costosos por demanda

Protection proxy. Provee control de acceso a ciertos objetos.

Page 30: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Estructura

Page 31: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Participantes

Proxy. Mantiene una referencia que permite al proxy

acceder al sujeto real Provee una interfaz idéntica a la del sujeto Controla el acceso al objeto real y puede ser

responsible de crearlo y destruirlo

Subject

RealSubject

Page 32: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones estructurales

Colaboraciones

El proxy envía solicitudes a los sujetos reales cuando sea apropiado.

Consecuencias

Un proxy remoto puede ocultar el hecho de que el objeto reside en otro proceso

Un proxy virtual puede realizar optimizaciones, tales como crear un objeto por demanda

Page 33: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de Patrones de comportamientocomportamiento

(Behavioral patterns)(Behavioral patterns)

Page 34: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrón Command

Propósito. Encapsular una solucitud como un objeto de manera que se puedan parametrizar clientes con diferentes solicitudes, poner solicitudes en cola y soportar “deshacer operaciones”

Motivación.

Patrones de diseñoPatrones de diseño

MenuItemMenu Command

execute()

Application

ClickedaddMenuItem()

command.execute()

Page 35: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Aplicabilidad. Usar el patrón command cuando se desea

Parametrizar objetos con una acción a realizar

Especificar, encolar y ejecutar solicitudes en diferentes momentos

Soportar desacer. La operación execute puede almacenar estado para revertir efectos en el objeto command

Estructura.

Patrones de diseñoPatrones de diseño

Invoker

ConcreteCommand

Client

execute()

Command

execute()

ConcreteCommand execute()

Page 36: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Participantes

Command

ConcreteCommand

Client

Invoker

Receiver

Colaboraciones

El cliente crea un comando concreto y especifica el recibidor

Todos los invocadores guardan el objeto command

El invocador emite una solicitud invocando execute en el comando

El comando concreto invoca operaciones en el recibidor para realizar la solicitud

Page 37: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Consecuencias

Comando desacopla a los objetos que invocan la operación del objeto que sabe como realizarla.

Los comandos pueden ser extendidos

Es fácil agregar nuevos comandos porque no hay que cambiar las clases existentes.

Page 38: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrón Iterator

Propósito. Proveer un mecanismo para acceder a los elementos de un objeto “agregado” sin exponer su representación interna

Motivación

AbstractList Iteratorfirst()next()isDone()currentItem()

ListIterator

Patrones de diseñoPatrones de diseño

createIterator()append()remove()

List

Client

Page 39: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Aplicabilidad. Usar paraAcceder al contenido de un objeto agregado sin exponer su representación internaSoportar múltiples formas de recorrer el agregadoProveer una plataforma común para recorrer objetos agregados diferentes

Estructura.

Agregate Iteratorfirst()next()isDone()currentItem()

ConcreteIterator

Patrones de diseñoPatrones de diseño

createIterator()

ConcreteAgregatecreateIterator()

Page 40: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Participantes

Iterator. Define una interfaz para recorrer los elementos

ConcreteIterator. Implementa la interfaz iterator.

Aggregate. Define una interfaz para crear un objeto iterador

ConcreateAggregate. Implementa la interfaz de creación del iterador.

Colaboraciones.

Un iterador concreto lleva registro del objeto actual en el agregado y determina el objeto siguiente en el recorrido.

Page 41: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Consecuencias

Soporta variaciones en el recorrido de un agregado

Los iteradores simplifican la interfaz del agregado.

Puede haber más de un recorrido pendiente.

Page 42: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrón Strategy

Propósito. Definir una familia de algoritmos, encapsularlos y hacerlos intercambiables

Motivación.

Composition Compositor

compose()

ArrayCompositor

Traverse()repair()

TexCompositorSimpleCompositor

compose()

compose()

compose()

Patrones de diseñoPatrones de diseño

Page 43: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Aplicabilidad. Usar Strategy cuando

Muchas clases relacionadas difieren solamente en su comportamiento. Permite configurar una clase con uno de múltiples comportamientos

Se necesitan diferentes variantes de un algortimo.

Un algoritmo usa datos cuya estructura los clientes no deben conocer.

Una clase define muchos comportamientos

Patrones de diseñoPatrones de diseño

Page 44: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Estructura.

Context StrategyAlgorithmInterface()

ConcreteStrategyC

contextInterface()

ConcreteStrategyBConcreteStrategyA

AlgorithmInterface()

AlgorithmInterface()

AlgorithmInterface()

Patrones de diseñoPatrones de diseño

Page 45: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Participantes

Strategy. Declara una interfaz común a todos los algoritmos soportados

ConcreteStrategy. Implementa el algoritmo que que usa la interfaz strategy.

Context.• Se configuran con un objeto ConcreteStrategy• Mantiene una referencia a un objeto Strategy• Puede definir una interfaz que permite acceder a

sus datos

Page 46: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Colaboraciones

La estrategia y el contexto interactúan para implementar el algoritmo seleccionado.

Un contexto envía las solicitudes que le hacen los clientes a la estrategia.

Consecuencias

Es una alternativa a la herencia

Eliminan estructuras condicionales

Selección de implementaciones.

Page 47: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Patrón Observer

Propósito. Definir una relación de dependencia uno a muchos entre objetos de manera que cuando el estado de un objeto cambia, todos sus dependientes son notificados y actualizados automáticamente.

Motivación

Page 48: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Aplicabilidad. Usar en las siguientes situaciones

Cuando una abstracción tiene dos aspectos, uno dependiente del otro.

Cuando un cambio a un objeto requiere cambios en otros y no se sabe cuantos objetos deben ser cambiados.

Cuando un objeto debe ser capaz de notificar a otros objetos sin saber quienes son.

Page 49: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Estructura

SubjectAttach(observer)detach(observer)notify()

Observer

Update()

ConcreteObserver

Update()

ObserverState

Subjectattach(observer)detach(observer)notify()

SubjectState

Page 50: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Participantes

Subject

Observer

ConcreteSubject

ConcreteObserver

Colaborations

ConcreteSubject notifica a sus observadores cuando ocurre un cambio

Al ser informado del cambio el observador puede solicitar al sujeto información sobre dichos cambios

Page 51: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Patrón Chain of Responsibility

Evitar acoplar al receptor de una solititud con el receptor.

Motivación. Sistema de ayuda

HelpHandlerHandleHelp()

Widget

Page 52: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Aplicabilidad. Usar cuando

Más de un objeto puede manejar una solicitud. No se sabe quién manejará la solicitud.

Se desea emitir una solicitud a uno de varios objetos sin decir quién la realizará.

Se debe especificar dinámicamente el conjunto de objetos que pueden manejar una solictud

Page 53: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Estructura

HandlerHandleRequest()

ConcreteHandler1HandleRequest()

ConcreteHandler2HandleRequest()

Page 54: PATRONES DE DISEÑO. Patrones estructurales (Structural patterns)

Patrones de diseñoPatrones de diseño

Participantes

Handler

ConcreteHandler

Client

Colaboraciones.

Cuando un cliente emite una solicitud, ésta se propaga a lo largo de la cadena hasta que un manejador concreto asuma la responsabilidad de manejarlo.