Patrones de diseño II
-
Upload
jjegonzalezf -
Category
Education
-
view
542 -
download
0
description
Transcript of Patrones de diseño II
«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