patrones de diseño ii

Post on 03-Jul-2015

542 Views

Category:

Education

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

Clase 2

TRANSCRIPT

«Promoviendo buenas prácticas de diseño y construcción de software»

Profesor: Juan José González Faúndez

Curso: Arquitectura y patrones J2EE

UNAB 2011

Patrones de diseño II

Patrones estructurales

• Adapter – Traductor que adapta la interfaz de un servidor a un cliente

• Bridge – Abstracción que vincula a una entre muchas implementaciones

• Composite – Estructura para construir jerarquías basadas en composición

• Decorator – Extender la funcionalidad dinámicamente de modo transparente

• Facade – Definir una interfaz unificada para varios subsistemas

• Flyweight – Compartición eficiente de muchos objetos de grano fino

• Proxy – Proporciona un sustituto de otro objeto para controlar su acceso

Adaptador

• Propósito: Convertir la interfaz de una clase en otra que esperan los clientes. • Otras denominaciones:

– Class Adapter y Object Adapter – Wrapper (Envolvente)

• Motivación – Reutilizar una clase de una biblioteca aunque su interfaz

no correspondiera exactamente con el que requiere una aplicación concreta.

– Para añadir funcionalidad que la clase reutilizada no proporciona

Adaptador

class Class Mo...

Target

+ Request()

Adaptee

+ SpecificRequest()

Adapter

+ Request()

adaptee->SpecificRequest()

Client

-adaptee

Adaptador

• Aplicación – Para usar una clase existente cuya interfaz no se

corresponde con el que se necesita

– Para crear una clase reutilizable que coopera con clases imprevistas (esto es, que no tienen necesariamente interfaces compatibles)

– El adaptador de objeto sólo: para utilizar varias subclases existentes para las que sería poco práctico adaptar su interfaz heredando de cada una. Un adaptador de objeto puede adaptar la interfaz de su clase padre

Adaptador Ejemplo class Class Mo...

«abstract»

Motor

+ acelerar() : void

+ apagar() : void

+ encender() : void

MotorEconomico

+ acelerar() : void

+ apagar() : void

+ encender() : void

MotorOferta

+ acelerar() : void

+ apagar() : void

+ encender() : void

Este motor ya no se

usa tanto

MotorElectrico

+ activar() : void

+ conectar() : void

+ desconectar() : void

+ detener() : void

+ moverMasRapido() : void

Una empresa nos envía

un motor eléctrico.

Como vemos, este

motor hace lo mismo

que el nuestro, pero de

manera y con llamadas

un poco diferentes. ¿

Cómo hacemos para

integrar este

MotorEléctrico al resto

de nuestro sistema? Así

es, con un adaptador o

adapter!

El adapter “envuelve”

al objeto extraño (por

eso le llaman wrapper

también, ya que

wrapper viene siendo

envoltorio).

Adaptador Solución Ejemplo 1 class Class Mo...

«abstract»

Motor

+ acelerar() : void

+ apagar() : void

+ encender() : void

MotorEconomico

+ acelerar() : void

+ apagar() : void

+ encender() : void

MotorOferta

+ acelerar() : void

+ apagar() : void

+ encender() : void

MotorElectrico

+ activar() : void

+ conectar() : void

+ desconectar() : void

+ detener() : void

+ moverMasRapido() : void

MotorElectricoAdapter

- motorElectrico: MotorElectrico

+ acelerar() : void

+ apagar() : void

+ encender() : void

Clase Adaptador

Clase Adaptada

Adaptador Solución Ejemplo 1

• Como ven el adapter se encarga no solo de corregir los nombres de los métodos, sino también de cosas como conectar y desconectar el motor, cosas que a nuestra implementación no le importan. Pero lo más importante es que ahora podemos utilizar esta implementación de Motor en nuestro sistema utilizando la implementación de «ellos». Por ejemplo podemos hacer cosas como esta:

Motor motor = new MotorEconomico(); motor.encender(); motor.acelerar(); motor.apagar(); motor = new MotorOferta(); motor.encender(); motor.acelerar(); motor.apagar(); motor = new MotorElectricoAdapter() ; motor.encender(); motor.acelerar(); motor.apagar();

Patrón Facade

• Provee una interface simple para acceder a subsistemas complejos.

• Motivación:

Patrón Facade

• Aplicabilidad: La interfaz es suficientemente buena para la mayoría de los clientes. Desacoplar las clases del subsistema de los clientes y otros subsistemas. De esta forma promovemos la independencia y la portabilidad.

Patrón Facade

• Estructura:

Patrón Facade

• Beneficios: – Ocultamos la implementación de los subsistemas a los

clientes, haciendo el subsistema fácil de usar. – Promovemos un bajo acoplamiento entre el cliente y

los subsistemas. Podemos realizar cambios en las clases sin comprometer el subsistema.

– Reduce la dependencia de compilación en sistemas grandes.

– Simplifica la portabilidad del sistema hacia otras plataformas.

– Note que el Facade no agrega ninguna funcionalidad, solo simplifica las interfaces.

Patrón Facade

• Un compilador

Patrón Facade

class Class Mo...

Prestamo

Banco

Credito

Hipoteca

- banco: Banco

- credito: Credito

- prestamo: Prestamo

+ EsElegible(int, Cliente) : boolean

Cliente

Patrón Composite

• Componer objetos en estructuras de árbol para representar jerarquías. El patrón Composite permite a los clientes tratar objetos individuales y composiciones de objetos de manera uniforme.

• La aplicación del patrón composite es simple, las clases compuesta extienden de una clase base que representa los objetos primitivos.

Patrón Composite class Class Mo...

Component

+ Add() : Component

+ GetChild() : Component

+ Operation()

+ Remove() : Component

Client

Leaf

+ Operation()

Composite

+ Add() : Component

+ GetChild() : Component

+ Operation()

forall g in children

g.Operation();

+ Remove() : Component

-children

1..*

Patrón Composite class Class Mo...

«abstract»

Menu

+ agregar(Menu) : void

+ eliminar(Menu) : void

+ mostrar(int) : void

CompositeMenu

- elementos: ArrayList

+ agregar(Menu) : void

+ eliminar(Menu) : void

+ mostrar(Menu) : void

+ mostrar(int) : void

MenuElemento

+ agregar(Menu) : void

+ eliminar(Menu) : void

+ mostrar(Menu) : void

+ mostrar(int) : void

Fin parte II

top related