Sie sind auf Seite 1von 10

Patrones de Diseo Estructurales

Los patrones estructurales se centran en cmo se pueden combinar las clases y los
objetos para formar estructuras ms grandes y complejas. Este tipo de patrones es
particularmente til cuando queremos combinar la funcionalidad de varias bibliotecas de
clases que se han desarrollado de forma independiente.
Los patrones estructurales de clases generalmente utilizan la herencia para
componer interfaces que nos permiten establecer las relaciones entre clases. Los patrones
estructurales asociados con objetos describen formas de componer los objetos para
conseguir nueva funcionalidad..

Clasificacin Patrones Estructurales


Adapter: Convierte la interfaz que ofrece una clase en otra esperada por otra clase.
Sirve de intermediario entre dos clases.
Bridge: Desacopla una abstraccin de su implementacin y les permite variar
independientemente. Divide un componente complejo en dos jerarquas relacionadas, la
abstraccin funcional y la implementacin interna.
Composite: Permite gestionar objetos complejos e individuales de forma uniforme.
Desarrolla una forma flexible de crear jerarquas en estructura de rbol de una
complejidad arbitraria, permitiendo a la vez que todos los elementos de la estructura
funcionen con una interfaz uniforme.
Decorator: Extiende la funcionalidad de un objeto dinmicamente de tal modo que
es transparente a sus clientes. Proporciona una forma flexible de introducir o eliminar
funcionalidad de un componente sin modificar su apariencia externa o su funcin.
Facade: Simplifica los accesos a un conjunto de objetos relacionados
proporcionando una interfaz de comunicacin.
Flyweight: Reduce el nmero de objetos detallados de muy bajo nivel en un sistema
usando la comparticin de objetos de forma eficiente.

Proxy: Proporciona un objeto (representante) con el que controlamos el acceso a otro


objeto.

Patrn Estructural Adapter


Descripcin del patrn

Nombre:
Adaptador
Tambin conocido como Wrapper (encapsulador)
Propiedades:
Tipo: estructural
Nivel: clase

Objetivo o Propsito:
Sirve de intermediario entre dos clases, convirtiendo las interfaces de una clase
para que pueda ser utilizada por otra. Permite que cooperen clases que tienen interfaces
incompatibles.

Aplicabilidad

Use el patrn Adapter cuando:

Se quiere usar una clase existente y su interfaz no concuerda con la que se necesita.

Deba realizar una traduccin entre interfaces de varios objetos.

Un objeto tiene que actuar como intermediario para un grupo de clases, y solo es
posible saber en tiempo de ejecucin qu clase ser utilizada.

Se quiere crear una clase reutilizable que coopere con clases no relacionadas o que
no han sido previstas, es decir, clases que no tienen porque tener interfaces
compatibles.

Es necesario usar varias subclases existentes, pero no resulta prctico adaptar su


interfaz heredando de cada una de ellas (adaptador de objetos).

Estructura

Figure 1: Estructura patrn adapter

Estructura en ingles

Figure 2: Estructura patrn adapter

Participantes

Objetivo: Define la interfaz especfica del dominio que usa el Cliente.


Cliente: Colabora con objetos que se ajustan a la interfaz Objetivo.

Adaptable: Define una interfaz existente que necesita ser adaptada.


Adaptador: Adapta la interfaz de Adaptable a la interfaz Objetivo

Variaciones del patrn

Un adaptador y mltiples adaptables. Dependiendo del diseo del sistema el


adaptador puede aadir funcionalidad a todos los Adaptables a la vez.
Adaptadores no basados en interfaz. Se da en las situaciones en las que no se
puede utilizar interfaces, por ejemplo, si se reciben componentes completos que no
implementan ninguna interfaz.
Una capa de interfaz entre el invocador y el adaptador, y otra entre el adaptador y
el adaptable. La capa entre el invocador y el adaptador permite que se puedan introducir
fcilmente nuevos adaptadores en el sistema en tiempo de ejecucin. Y entre el adaptador
y el adaptable, hace que los adaptables sean cargados dinmicamente en tiempo de
ejecucin.

Consecuencias

El cliente es independiente de las clases finales que utiliza. Es posible utilizar la


clase Adaptador para monitorizar que clases llaman a qu mtodos de las clases finales.

Adaptador de Clase
La clase adaptadora puede redefinir y ampliar la interfaz de la clase adaptada. La
clase adaptadora adapta una clase Adaptable a Objetivo, pero se refiere nicamente a una
clase Adaptable concreta, por lo tanto no nos servir para todas sus subclases.

Consecuencias
Adaptador de Objeto:

Permite que un mismo Adaptador funcione con muchos Adaptables.

La clase adaptadora puede utilizar todas las subclases de la clase adaptada, ya que
tiene constancia de los objetos que instancia.

Hace que sea ms difcil redefinir el comportamiento de Adaptable. Se necesitar


crear una subclase de Adaptable y hacer que el Adaptador se refiera a la subclase en
vez de a la clase Adaptable en s.

Patrones relacionados

Bridge: Aunque son parecidos tienen objetivos diferentes ya que Bridge est
pensado para separar una interfaz de su implementacin, mientras que Adapter cambia la
interfaz de un objeto existente.
Decorator: Adapter modifica la interfaz de un objeto, pero mantiene su
funcionalidad, Decorator permite que la interfaz sea igual pero mejora su funcionalidad.
Facade: Es una alternativa a Adaptador cuando en lugar de llamar a un solo
objeto se necesita llamar a varios.
Proxy: Es similar a Adaptador en el sentido en que proporcionan una interfaz,
con la diferencia en que Proxy ofrece la misma interfaz que la clase a la que se llama.

Diagrama ejemplo

Figure 3: : Ejemplo patrn adapter

Cdigo ejemplo

AdaptadorFecha.java
package Adapter;
//Clase para adaptar fechas USA (MM,DD,AAAA) a ES (DD/MM/AAAA)
import java.util.*;
class AdaptadorFecha implements Fecha {
//Adapta el objeto de tipo Fecha USA
FechaUS fus;
//constructor
public AdaptadorFecha(FechaUS fus) {

this.fus = fus;
}
//mtodos
@Override
public String toString() {
StringTokenizer st = new StringTokenizer(fus.toString(), ",");
String mm = st.nextToken();
___________________________________;
String aaaa = st.nextToken();
return dd + "/" + mm + "/" + aaaa;
}
public int getAo() {
return this.fus.getYear();
}
public void setAo(int ao) {
_______________________________;
}
public int getDia() {
__________________________________________;
}
public void setDia(int dia) {
this.fus.setDay(dia);
}
public int getMes() {
__________________________________________;
}
public void setMes(int mes) {
this.fus.setMonth(mes);
}
}
Fecha.java
package Adapter;
//Interface para manejar fechas en ES (DD/MM/AAAA)
interface Fecha {

@Override
public String toString();
public int getAo();
public void setAo(int ao);
public int getDia();
_____________________________________;
public int getMes();
________________________________________;
}
FechaUS.java
package Adapter;
//Clase para manejar fechas en USA (MM,DD,AAAA)
import java.util.*;
class FechaUS {
//atributos
private int year;
private int month;
private int day;
//constructores
public FechaUS(int month, int day, int year) {
________________________________;
this.month = month;
__________________________________________;
}
public FechaUS(String date) {
StringTokenizer st = new StringTokenizer(date, ",");
String mm = st.nextToken();
________________________________________________;
________________________________________________;
____________________________________________;
this.month = Integer.parseInt(mm);

this.year = Integer.parseInt(aa);
}
//mtodos
@Override
public String toString() {
return month + "," + day + "," + year;
}
public int getYear() {
return this.year;
}
public void setYear(int year) {
this.year = year;
}
public int getDay() {
return this.day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return this.month;
}
public void setMonth(int month) {
this.month = month;
}
}
Cliente.java
package Adapter;
import java.io.*;
public class Cliente {
public static void main(String args[]) throws IOException {

BufferedReader entrada = new BufferedReader(new


InputStreamReader(System.in));
Fecha fecha;
String f;
System.out.println("Introduce fecha en formato USA (MM,DD,AAAA): ");
f = entrada.readLine();
fecha = new AdaptadorFecha(new FechaUS(f));
_________________________________________________;
System.out.println(fecha.toString());
}
}

Das könnte Ihnen auch gefallen