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

Post on 03-Feb-2016

303 views 2 download

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

PATRONESPATRONESDE DISEÑODE DISEÑO

Patrones Patrones estructuralesestructurales

(Structural patterns)(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

Estructura. Class Adapter

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

Target

Adapter

Client

request()

request()

Adaptee

specificRequest()

Patrones estructurales

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

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

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

Patrones estructurales

Estructura

Implementador

ConcreteImplA

operationImp()

operationImp()

ConcreteImplB

operationImp()

Abstraction

operacion()

RefinedAbstraction

Abstraction

operacion()

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

Patrones estructurales

Consecuencias

Desacoplamiento entre interfaz e implementación

Más facilidad para extender el sistema

Esconde los detalles de la implementación

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

Patrones estructurales

Estructura

Componente

Hoja

operacion()agregar(comp)eliminar(comp)

operacion()

Compuesto

operation()agregar(comp)

Cliente

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

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

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()

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

Patrones estructurales

Estructura

Component

TextView

operation()

operation()

Decorator operation()

ConcreteDecoratorB operation()addedBehavior()

ConcreteDecoratorA operation()addedBehavior()

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.

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

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

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.

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.

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.

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

Patrones estructurales

Estructura

Patrones estructurales

Participantes

Flyweight

ConcreteFlyweight

UnsharedConcreteFlyweight

FlyweightFactory

Cliente

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.

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

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.

Patrones estructurales

Estructura

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

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

Patrones de Patrones de comportamientocomportamiento

(Behavioral patterns)(Behavioral 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()

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()

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

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.

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

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()

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.

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.

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

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

Estructura.

Context StrategyAlgorithmInterface()

ConcreteStrategyC

contextInterface()

ConcreteStrategyBConcreteStrategyA

AlgorithmInterface()

AlgorithmInterface()

AlgorithmInterface()

Patrones de diseñoPatrones de diseño

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

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.

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

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.

Patrones de diseñoPatrones de diseño

Estructura

SubjectAttach(observer)detach(observer)notify()

Observer

Update()

ConcreteObserver

Update()

ObserverState

Subjectattach(observer)detach(observer)notify()

SubjectState

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

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

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

Patrones de diseñoPatrones de diseño

Estructura

HandlerHandleRequest()

ConcreteHandler1HandleRequest()

ConcreteHandler2HandleRequest()

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.